一、Docker容器概述:
- 簡單理解容器是映象的一個例項。
- 映象是靜態的只讀檔案,而容器的執行需要可寫檔案層。
二、建立容器
[root@web130 ~]# docker create -it ubuntu:latest #-i開啟標準輸入,-t是開啟一個偽終端
17c54a92a4e83503e329c3c80e4d10bf298516edffa56b2cea8fa2aa73d4c00c
#我們要了解一下容器識別符號:如上顯示的CONTAINER ID作為容器的唯一標識。
#CONTAINER ID 預設是128位,但是一般16位就足以保證其在本機的唯一性。所以預設我們使用簡約形式即可(id的前16位)。
#當然我們也可以根據自己情況選擇適當的位數,來代表容器啟停
[root@web130 ~]# docker ps -a #顯示所有容器,#docker ps 顯示正在執行的容器。#docker ps --no-trunc輸出資訊不截斷顯示,可以看到完整id
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 17c54a92a4e8 ubuntu:latest "/bin/bash" 8 seconds ago Created quizzical_bhabha
1、檢視docker執行的程式:
[root@web130 ~]# docker container ls #新命令等價與下邊ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [root@web130 ~]# docker ps #可以看到已經啟動的容器、每個容器的ID、所使用的映象、建立時間、當前狀態、監聽的埠和容器的名字 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [root@web130 ~]#
2、啟動容器:
#我們可以通過容器ID不同的前幾位id號來代表指定在容器,也可以用全部ID號
[root@web130 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 17c54a92a4e8 ubuntu:latest "/bin/bash" 6 minutes ago Created quizzical_bhabha [root@web130 ~]# docker start 17 17 [root@web130 ~]# docker ps #可以看到已經啟動的容器、每個容器的ID、所使用的映象、建立時間、當前狀態、監聽的埠和容器的名字
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 17c54a92a4e8 ubuntu:latest "/bin/bash" 8 minutes ago Up About a minute quizzical_bhabha [root@web130 ~]#
3、新建並啟動一個容器
**docker run在建立容器的時候,在後臺執行的標準操作如下:
- 檢查本地是否有指定映象,如果沒有直接從公有倉庫下載;
- 利用映象建立一個容器,並啟動該容器;
- 分配一個檔案系統,並在只讀的映象層外邊掛載一層可讀寫層;
- 從宿主主機配置的網橋介面中橋接一個虛擬介面到容器中;
- 執行使用者指定的應用程式;
- 執行完畢後容器制動終止。
[root@web130 ~]# docker run ubuntu /bin/echo `hello world` hello world [root@web130 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 17c54a92a4e8 ubuntu:latest "/bin/bash" 13 minutes ago Up 6 minutes quizzical_bhabha [root@web130 ~]# #**啟動一個bash終端,允許使用者互動 [root@web130 ~]# docker run -it ubuntu:14.04 /bin/bash root@041941f24d3d:/# ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var root@041941f24d3d:/# pwd / root@041941f24d3d:/# ps #可以看到容器只執行了一個bash應用,並沒有執行其他無關程式 PID TTY TIME CMD 1 pts/0 00:00:00 bash 15 pts/0 00:00:00 ps root@041941f24d3d:/# exit #退出容器,或者Ctrl+d exit [root@web130 ~]# #我們可以加上--rm選項,--name選項,容器退出時,自動刪除容器 [root@web130 ~]# docker run -it --rm ubuntu:14.04 /bin/bash [root@web130 ~]# docker run --name t1 -it --rm ubuntu:14.04 /bin/bash #指定容器名 某些情況下,docker run 容器執行錯誤,預設情況下常見錯誤碼: #125:Docker daemon執行錯誤,例如指定不支援的Docker命令引數; #126:所指定命令無法執行,例如許可權出錯; #127:容器內命令無法找到。 命令執行錯誤會返回錯誤碼
4、容器守護態(Daemonized)執行
#一些時候讓容器在後臺執行,用引數-d 來實現 [root@web130 ~]# docker run -d ubuntu /bin/sh -c "while true;do echo hello world;sleep 1;done" da81dbb0e2dadde799ca4d40189c3d14911ea269f76ce7843f9d585d7efbcd6a [root@web130 ~]# [root@web130 ~]# docker ps #可以看到執行的容器,當然我們也可以上條命令中--name 指定容器名字,便於識別 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES da81dbb0e2da ubuntu "/bin/sh -c `while t…" 14 seconds ago Up 12 seconds festive_mirzakhani 17c54a92a4e8 ubuntu:latest "/bin/bash" 42 minutes ago Up 34 minutes quizzical_bhabha [root@web130 ~]# docker logs da8 hello world hello world hello world ....省略....
三、終止容器
stop和kill命令的區別: *stop是首先傳送SIGTERM訊號,等一段時間(預設10秒),在傳送SIGKILL訊號終止容器 *kill直接傳送SIGKILL終止容器,強制終止容器 [root@web130 ~]# docker stop da8 #可以-t 指定等待時間, da8 [root@web130 ~]# docker ps #檢視啟動的容器 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 17c54a92a4e8 ubuntu:latest "/bin/bash" 45 minutes ago Up 38 minutes quizzical_bhabha [root@web130 ~]# docker ps -a #檢視所有容器 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES da81dbb0e2da ubuntu "/bin/sh -c `while t…" 4 minutes ago Exited (137) 13 seconds ago festive_mirzakhani 041941f24d3d ubuntu:14.04 "/bin/bash" 19 minutes ago Exited (0) 19 minutes ago nervous_jepsen 439157f8ea55 ubuntu "/bin/echo `hello wo…" 33 minutes ago Exited (0) 33 minutes ago vigorous_boyd [root@web130 ~]# docker ps -qa #檢視所有容器ID da81dbb0e2da 041941f24d3d 439157f8ea55 [root@web130 ~]# docker start da8 #啟動指定容器 [root@web130 ~]# docker restart da8 #將一個執行的容器先終止,然後在重啟啟動它
四、進入容器
#前文-d我們將容器放在後臺執行,無法操作也無法看到容器中的資訊,如何進入一個後臺執行的容器,方法如下:
1、attach命令 [root@web130 ~]# docker run --name ylt -itd ubuntu #建立一個名字為ylt的容器 7058cf192514f4a6de3340d86d61d6f2dbea0503f85ae35634fb2511cc026f6d [root@web130 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NMES 7058cf192514 ubuntu "/bin/bash" 6 seconds ago Up 6 seconds ylt [root@web130 ~]# docker attach ylt #進入後臺執行的容器 root@7058cf192514:/# ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var root@7058cf192514:/# 注:當多窗同時通過attach命令連到容器的時候,所有視窗會同步顯示。當某個視窗阻塞的時候,其他視窗無法執行命令 當一個視窗exit容器的時候另個也會退出。 2、exec命令,最推薦的一種方式 #docker從1.3.0版本起提供了更加方便的exec命令,可以在容器內直接執行任意命令,同時如果多視窗執行,不會出現attach的問題: [root@web130 ~]# docker start ylt #啟動容器 ylt [root@web130 ~]# docker exec -it 7058cf192514 /bin/bash #進入容器,可以多視窗執行 root@7058cf192514:/# ls bin dev home lib64 mnt proc run srv tmp var boot etc lib media opt root sbin sys usr root@7058cf192514:/# exit [root@web130 ~]# 3、nsenter工具需要安裝,此處不詳細介紹
五、刪除容器
#docker rm 刪除一個終止的容器
#docker rm -f 可以強制刪除一個正在執行容器
[root@web130 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7058cf192514 ubuntu "/bin/bash" 19 minutes ago Up 7 minutes ylt da81dbb0e2da ubuntu "/bin/sh -c `while t…" 41 minutes ago Exited (137) 37 minutes ago festive_mirzakhani 041941f24d3d ubuntu:14.04 "/bin/bash" About an hour ago Exited (0) About an hour ago nervous_jepsen [root@web130 ~]# docker rm 041941f24d3d [root@web130 ~]# docker ps #我們可以看到剛才啟動的容器 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7058cf192514 ubuntu "/bin/bash" 22 minutes ago Up 10 minutes ylt 17c54a92a4e8 ubuntu:latest "/bin/bash" About an hour ago Up About an hour quizzical_bhabha [root@web130 ~]# docker rm ylt #執行中的容器無法刪除 Error response from daemon: You cannot remove a running container 7058cf192514f4a6de3340d86d61d6f2dbea0503f85ae35634fb2511cc026f6d. Stop the container before attempting removal or force remove [root@web130 ~]# docker rm -f ylt #可以強制刪除執行中的容器,直接傳送的是SIGKILL訊號 ylt [root@web130 ~]# [root@web130 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 17c54a92a4e8 ubuntu:latest "/bin/bash" About an hour ago Up About an hour quizzical_bhabha [root@web130 ~]#
六、匯入和匯出容器
#其實就是一個容器遷移的過程,不用考慮容器是否為執行狀態
1、匯出容器可以使用-o,或者輸出重定向“>” [root@web130 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES da81dbb0e2da ubuntu "/bin/sh -c `while t…" About an hour ago Exited (137) 44 minutes ago festive_mirzakhani 041941f24d3d ubuntu:14.04 "/bin/bash" About an hour ago Exited (0) About an hour ago nervous_jepsen [root@web130 ~]# docker export -o test_docker_run.tar da8 #-o [root@web130 ~]# ls |grep test_docker* test_docker_run.tar [root@web130 ~]# docker export 041 >test_docker_stop.tar #輸出重定向 [root@web130 ~]# ls |grep test_docker test_docker_run.tar test_docker_stop.tar [root@web130 ~]# 2、匯入容器 #匯出的檔案可以使用docker import 命令匯入變成映象,該命令格式為: [root@web130 ~]# cat test_docker_run.tar |docker import - test/ubuntu:v1.0 sha256:7528eea6db23ec008244e9f65205421fcaa164748054b25dbae1a00f84582b66 [root@web130 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE test/ubuntu v1.0 7528eea6db23 13 seconds ago 69.8MB #通過指定 URL 或者某個目錄來匯入 [root@web130 ~]#docker import http://example.com/exampleimage.tgz test/ubuntu:v1.0