上面已經介紹了Docker鏡像管理的常用命令,有了鏡像之後就可以方便的運行容器了,所以本篇就依據容器的生命週期來展開,主要記錄Docker容器管理的常用命令和示例。
創建容器:
docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
創建並運行容器:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
PS:因爲以上兩個命令都是用來創建容器,且命令的參數相似,而docker create用的不多,一般以docker run爲主進行介紹。
啓動參數:
-i, --interactive:交互式
-t, --tty:分配一個僞終端
-d, --detach: 運行容器到後臺
-a, --attach list:附加到運行的容器
--dns list:設置DNS服務器
-e, --env list:設置環境變量
--env-file list:從文件讀取環境變量
-p, --publish list:發佈容器端口到主機
-P, --publish-all:發佈容器所有EXPOSE的端口到宿主機隨機端口
-h, --hostname string:設置容器主機名
--ip string:設定容器IP,只能用於自定義網絡
--link list:添加連接到另一個容器
--network:連接容器到一個網絡
--mount mount:掛載宿主機分區到容器
-v, --volume list:掛載宿主機目錄到容器
--restart string:容器退出時重啓策略,默認no [always|on-failure]
--add-host list:添加其他主機到容器中/etc/hosts
資源限制參數:
-m, --memory:容器可以使用的最大內存量
--memory-swap:允許交換到磁盤的內存量
--memory-swapiness=<0-100>:容器使用swap分區交換的百分比(0-100,默認爲-1)
--memory-reservation:內存軟限制,Docker檢測主機容器爭用或內存不足時所激活的軟限制,使用此選項,值必須設置低於-memory,以使其優先
--oom-kill-disable:當宿主機內存不足時,內核會殺死容器中的進程。建議設置了-memory選項再禁用OOM。如果沒有設置,主機可能會耗盡內存
--cpus:限制容器可以使用多少可用的CPU資源
--cpuset-cpus:限制容器可以使用特定的CPU
--cpu-shares:此值設置爲大於或小於默認1024值,以增加或減少容器的權重,並使其可以訪問主機CPU週期的更大或更小比例
示例:
創建一個容器
[root@centos7 ~]# docker create -it --name centos01 centos:latest 7aa2a5ddae29ee41f2ef774504d0f547cd26aeaa33bbed0cd167eaa8960d9778 [root@centos7 ~]# docker run -it --name centos02 centos:latest [root@073dcceedc07 /]#
創建一個名爲busybox01的容器,且後臺運行
[root@centos7 ~]# docker run -itd --name busybox01 busybox e41ee0ce0c03995e7dff56f0d6e6ae370a105d704681f373649e231b9e59e861 # 注意:因爲docker create僅創建容器,並不啓動容器,所以docker create並沒有-d參數。
創建一個名爲centos03的容器,設置其DNS地址爲114.114.114.114,容器的主機名爲centos03,並添加一個環境變量token,其值爲hello。
[root@centos7 ~]# docker run -itd --name centos03 --dns 114.114.114.114 -e "token=hello" -h centos03 centos 6008f2b49accfc60a7d6b663cce393768255915181d0c21d3408a4e09edce720 [root@centos7 ~]# docker exec -it centos03 /bin/bash [root@centos03 /]# hostname centos03 [root@centos03 /]# cat /etc/resolv.conf search contoso.com nameserver 114.114.114.114 [root@centos03 /]# echo $token hello
創建一個名爲websrv01的容器,將容器的tcp 80端口映射到本地主機的tcp 8080端口,另外將本地的/usr/share/nginx/html目錄只讀掛載到容器的/usr/share/nginx/html目錄
[root@centos7 ~]# mkdir /usr/share/nginx/html -p [root@centos7 ~]# echo "hello,world." >> /usr/share/nginx/html/index.html [root@centos7 ~]# docker run -itd --name websrv01 -p 8080:80/tcp -v /usr/share/nginx/html:/usr/share/nginx/html:ro nginx 05701d7807761f5569cd4ce37ff465135c2ebbf727924852f3ed4f203aff2922 [root@centos7 ~]# curl http://127.0.0.1:8080 hello,world.
創建一個名爲centos04的容器,限制其最多隻能使用1個cpu
[root@centos7 ~]# docker run -itd --name centos04 --cpus 1 centos 99f8cbf1bba1db7045be7bbcc4b51124dea8690c4b1f2d220fdc46fbddebd762 [root@centos7 ~]# docker stats centos04 CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS centos04 0.00% 376 KiB / 3.686 GiB 0.01% 648 B / 648 B 0 B / 0 B 1
創建一個名爲centos05的容器,限制其最多隻能使用2個cpu,且綁定到本地主機的前兩個cpu核心
[root@centos7 ~]# docker run -itd --name centos05 --cpuset-cpus=0,1 --cpus=2 centos d2439dfe16a886716bc8b610141f7a0a6376bfe51fc00e656b9a4bcda0b6aa2b
創建一個名爲centos06的容器,限制其最大內存爲512M
[root@centos7 ~]# docker run -itd --name centos06 --memory 512m centos 597bcf3f998f9d7eb8359e90e201233045698feebd29a40bb8ca694638a6012e [root@centos7 ~]# docker stats centos06 CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS centos06 0.00% 380 KiB / 512 MiB 0.07% 648 B / 648 B 0 B / 0 B 1
查看容器:
docker ps [OPTIONS]
-a, --all:查看所有容器(包括已經停止的)
-f, --filter filter:根據提供的條件輸出要顯示的容器
-n, --last int:查看最後(近)n個創建的容器
-l, --latest:查看最後一個創建的容器(包括所有狀態下的容器)
-q, --quite:僅顯示容器ID
-s, --size:顯示容器的總文件大小
該命令會返回一個列表,其中各列的含義如下:
CONTAINER ID:容器的唯一表示ID。
IMAGE:創建容器時使用的鏡像。
COMMAND:容器最後運行的命令。
CREATED:創建容器的時間。
STATUS:容器狀態。
PORTS:對外開放的端口。
NAMES:容器名。可以和容器ID一樣唯一標識容器,同一臺宿主機上不允許有同名容器存在,否則會衝突。
示例:
[root@centos7 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 597bcf3f998f centos "/bin/bash" 14 minutes ago Up 14 minutes centos06 d2439dfe16a8 centos "/bin/bash" 18 minutes ago Up 18 minutes centos05
[root@centos7 ~]# docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 597bcf3f998f centos "/bin/bash" 14 minutes ago Up 14 minutes centos06
[root@centos7 ~]# docker ps -n 1 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 597bcf3f998f centos "/bin/bash" 14 minutes ago Up 14 minutes centos06
[root@centos7 ~]# docker ps -f name=centos* CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 597bcf3f998f centos "/bin/bash" 14 minutes ago Up 14 minutes centos06 d2439dfe16a8 centos "/bin/bash" 19 minutes ago Up 19 minutes centos05 [root@centos7 ~]# docker ps -f status=running CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 597bcf3f998f centos "/bin/bash" 17 minutes ago Up 17 minutes centos06 d2439dfe16a8 centos "/bin/bash" 22 minutes ago Up 22 minutes centos05 [root@centos7 ~]# docker ps -f status=created CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 54fa9de76500 busybox "sh" 25 seconds ago Created busybox01
[root@centos7 ~]# docker ps -q 597bcf3f998f d2439dfe16a8
[root@centos7 ~]# docker ps -s CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES SIZE 597bcf3f998f centos "/bin/bash" 15 minutes ago Up 15 minutes centos06 0 B (virtual 202 MB) d2439dfe16a8 centos "/bin/bash" 19 minutes ago Up 19 minutes centos05 0 B (virtual 202 MB)
修改容器:
docker update [OPTIONS] CONTAINER [CONTAINER...] 更新一個或多個容器的配置
該命令支持修改容器的cpu、內存等相關配置,所用到的參數跟啓動容器時使用到的參數大體一致,在此就不一一列舉了。
示例:
[root@centos7 ~]# docker run -itd --name centos07 --cpuset-cpus 0 --memory 512m centos c410b13fb5d7a4140facfecb30a1d17c470c54e343506a1dffa153d3caef9218 [root@centos7 ~]# docker update --cpuset-cpus 1 --memory 1024m centos07 centos07 [root@centos7 ~]# docker stats centos07 CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS centos07 0.00% 380 KiB / 1 GiB 0.04% 648 B / 648 B 0 B / 0 B 1
停止容器:
docker stop [OPTIONS] CONTAINER [CONTAINER...]
-t, --time int:在徹底殺掉容器前等待指定秒數
示例:
[root@centos7 ~]# docker stop centos05 centos05 [root@centos7 ~]# docker stop -t 2 centos06 centos06
刪除容器:
docker rm [OPTIONS] CONTAINER [CONTAINER...]
-f, --force:強制關閉一個正在運行的容器
-l, --link:移除指定鏈接
-v, --volumes:移除綁定到容器上的卷
示例:
[root@centos7 ~]# docker ps -f name=centos* CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 597bcf3f998f centos "/bin/bash" 38 minutes ago Up 21 seconds centos06 d2439dfe16a8 centos "/bin/bash" 42 minutes ago Up 23 seconds centos05 [root@centos7 ~]# docker rm centos06 Error response from daemon: You cannot remove a running container 597bcf3f998f9d7eb8359e90e201233045698feebd29a40bb8ca694638a6012e. Stop the container before attempting removal or use -f [root@centos7 ~]# docker stop centos06 centos06 [root@centos7 ~]# docker rm centos06 centos06 [root@centos7 ~]# docker rm -f centos05 centos05
[root@centos7 ~]# docker rm -v websrv01 Error response from daemon: You cannot remove a running container b1136055649aec6ac010e6fd2dea0038e7dc4b94c69b352eb43f971539152904. Stop the container before attempting removal or use -f [root@centos7 ~]# docker rm -fv websrv01 websrv01
附加容器:
docker attach [OPTIONS] CONTAINER 附加到一個正在運行的容器中
[root@centos7 ~]# docker run -itd --name centos03 centos 20c77fd15674dc21b43b2129b47e99367e3780b8156da65d84389880bb468d26 [root@centos7 ~]# docker attach centos03 [root@20c77fd15674 /]# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 10:18 ? 00:00:00 /bin/bash root 13 1 0 10:18 ? 00:00:00 ps -ef [root@20c77fd15674 /]# exit exit [root@centos7 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 20c77fd15674 centos "/bin/bash" 18 seconds ago Exited (0) 2 seconds ago centos03
注意:如果使用docker attach進入到容器的交互模式,使用exit會使容器退出,此時可以使用CTRL+P、CRTL+Q組合鍵退出容器交互界面,這樣就避免了容器退出的問題。
容器執行命令:
docker exec [OPTIONS] CONTAINER COMMAND [ARG...] 在一個運行中的容器中執行命令
-d, --detach 分離模式,在後臺執行命令
-e, --env list 設置環境變量,默認爲[]
-i, --interactive 保持標準輸出打開,及時沒有附加到容器
--privileged 執行需要其他權限的命令
-t, --tty 分配一個pty
-u, --user string 指定用戶名或者UID,格式爲 : <name|uid>[:<group|gid>]
示例:
[root@centos7 ~]# docker run -itd --name centos01 centos 5bf713f499af4a4bb78308fa51f6650170e774f55bd0072c40482f218f71bd02 [root@centos7 ~]# docker exec -d centos01 ping www.baidu.com [root@centos7 ~]# docker top centos01 UID PID PPID C STIME TTY TIME CMD root 1633 1618 0 09:19 pts/1 00:00:00 /bin/bash root 1690 1675 0 09:21 ? 00:00:00 ping www.baidu.com
[root@centos7 ~]# docker exec -it centos01 /bin/bash [root@5bf713f499af /]# ps PID TTY TIME CMD 17 ? 00:00:00 bash 29 ? 00:00:00 ps
注:使用docker exec進入容器交互模式後,可以使用exit退出,這不會造成容器退出,這點有別於docker attach。
[root@centos7 ~]# docker exec -it -e var=abc centos01 bash [root@5bf713f499af /]# echo $var abc
查看容器日誌:
docker logs [OPTIONS] CONTAINER
--details 顯示額外的詳細信息到日誌中(有則顯示)
-f, --follow 監視日誌輸出(相當於tail -f的輸出)
--since string 顯示自某一時間戳後的日誌Show logs since timestamp
--tail string 顯示自日誌結尾的N行(相當於tail -n的輸出)
-t, --timestamps 顯示時間戳
示例:
[root@centos7 ~]# docker run -itd --name websrv01 -p 8080:80 -v /usr/share/nginx/html:/usr/share/nginx/html:ro nginx c39e285d431b3718d50e51946f4ad97f1fa1ae833ca66e774a880414c3a94b43 [root@centos7 ~]# docker logs websrv01 172.17.0.1 - - [14/Feb/2019:01:41:16 +0000] "GET / HTTP/1.1" 200 13 "-" "curl/7.29.0" "-" 172.17.0.1 - - [14/Feb/2019:01:41:17 +0000] "GET / HTTP/1.1" 200 13 "-" "curl/7.29.0" "-" 172.17.0.1 - - [14/Feb/2019:01:41:17 +0000] "GET / HTTP/1.1" 200 13 "-" "curl/7.29.0" "-" 172.17.0.1 - - [14/Feb/2019:01:41:18 +0000] "GET / HTTP/1.1" 200 13 "-" "curl/7.29.0" "-" 注:此時在另外一個session中執行如下命令: [root@centos7 ~]# for i in `seq 20`;do curl http://localhost:8080/;sleep 2;done
[root@centos7 ~]# docker logs -f websrv01 172.17.0.1 - - [14/Feb/2019:01:41:16 +0000] "GET / HTTP/1.1" 200 13 "-" "curl/7.29.0" "-" 172.17.0.1 - - [14/Feb/2019:01:41:17 +0000] "GET / HTTP/1.1" 200 13 "-" "curl/7.29.0" "-" 172.17.0.1 - - [14/Feb/2019:01:41:17 +0000] "GET / HTTP/1.1" 200 13 "-" "curl/7.29.0" "-"
注:使用-f進入監視模式,用作持續觀察日誌輸出,退出時使用CTRL+C鍵。
[root@centos7 ~]# docker logs -t --details websrv01 2019-02-14T01:41:16.434219000Z 172.17.0.1 - - [14/Feb/2019:01:41:16 +0000] "GET / HTTP/1.1" 200 13 "-" "curl/7.29.0" "-" 2019-02-14T01:41:17.369332000Z 172.17.0.1 - - [14/Feb/2019:01:41:17 +0000] "GET / HTTP/1.1" 200 13 "-" "curl/7.29.0" "-" 2019-02-14T01:41:17.851037000Z 172.17.0.1 - - [14/Feb/2019:01:41:17 +0000] "GET / HTTP/1.1" 200 13 "-" "curl/7.29.0" "-"
[root@centos7 ~]# docker logs -t --tail 5 websrv01 2019-02-14T01:42:15.467576000Z 172.17.0.1 - - [14/Feb/2019:01:42:15 +0000] "GET / HTTP/1.1" 200 13 "-" "curl/7.29.0" "-" 2019-02-14T01:42:17.478720000Z 172.17.0.1 - - [14/Feb/2019:01:42:17 +0000] "GET / HTTP/1.1" 200 13 "-" "curl/7.29.0" "-" 2019-02-14T01:42:19.491140000Z 172.17.0.1 - - [14/Feb/2019:01:42:19 +0000] "GET / HTTP/1.1" 200 13 "-" "curl/7.29.0" "-" 2019-02-14T01:42:21.502774000Z 172.17.0.1 - - [14/Feb/2019:01:42:21 +0000] "GET / HTTP/1.1" 200 13 "-" "curl/7.29.0" "-" 2019-02-14T01:42:23.513828000Z 172.17.0.1 - - [14/Feb/2019:01:42:23 +0000] "GET / HTTP/1.1" 200 13 "-" "curl/7.29.0" "-"
暫停容器:
docker pause CONTAINER [CONTAINER...] 暫停一個或多個容器的所有進程
示例:
[root@centos7 ~]# docker pause websrv01 websrv01 [root@centos7 ~]# docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c39e285d431b nginx "nginx -g 'daemon ..." 31 minutes ago Up 31 minutes (Paused) 0.0.0.0:8080->80/tcp websrv01 [root@centos7 ~]# curl --connect-timeout 15 -m 30 http://localhost:8080 curl: (28) Operation timed out after 30000 milliseconds with 0 out of -1 bytes received
恢復容器:
docker unpause CONTAINER [CONTAINER...] 恢復一個或多個容器的所有進程
示例:
[root@centos7 ~]# docker unpause websrv01 websrv01 [root@centos7 ~]# docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c39e285d431b nginx "nginx -g 'daemon ..." 38 minutes ago Up 38 minutes 0.0.0.0:8080->80/tcp websrv01 [root@centos7 ~]# curl --connect-timeout 15 -m 30 http://localhost:8080 hello,world.
查看容器端口映射:
docker port CONTAINER [PRIVATE_PORT[/PROTO]]
示例:
[root@centos7 ~]# docker port websrv01 80/tcp -> 0.0.0.0:8080
重命名容器:
docker rename CONTAINER NEW_NAME
示例:
[root@centos7 ~]# docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c39e285d431b nginx "nginx -g 'daemon ..." 44 minutes ago Up 44 minutes 0.0.0.0:8080->80/tcp websrv01 [root@centos7 ~]# docker rename websrv01 nginx01 [root@centos7 ~]# docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c39e285d431b nginx "nginx -g 'daemon ..." 45 minutes ago Up 45 minutes 0.0.0.0:8080->80/tcp nginx01
顯示容器資源使用情況:
docker stats [OPTIONS] [CONTAINER...]
-a, --all 顯示所有容器的資源使用情況(默認僅顯示正在運行的容器的資源使用情況)
--format string 格式化輸出(使用Go模板展示)
示例:
[root@centos7 ~]# docker stats --all CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS c39e285d431b 0.00% 1.395 MiB / 3.686 GiB 0.04% 16.4 kB / 17.7 kB 15.8 MB / 0 B 2 5bf713f499af -- -- / -- -- -- -- -- 20c77fd15674 -- -- / -- -- -- -- -- 54fa9de76500 -- -- / -- -- -- -- -- ...... [root@centos7 ~]# docker stats --all --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}" nginx01 centos01 mycentos busybox01 CONTAINER CPU % MEM USAGE / LIMIT nginx01 0.00% 1.395 MiB / 3.686 GiB centos01 -- -- / -- mycentos -- -- / -- busybox01 -- -- / -- ......
查看容器的詳細信息:
docker inspect [OPTIONS] NAME|ID [NAME|ID...]
該命令既可以查看容器的信息也可以查看鏡像的信息,官方的解釋是:返回Docker對象的底層信息。相關參數在上一篇就已經介紹,不再贅述。
查看容器進程:
docker top CONTAINER [ps OPTIONS] 列出單個容器正在運行的進程列表
示例:
[root@centos7 ~]# docker top nginx01 UID PID PPID C STIME TTY TIME CMD root 1907 1893 0 09:40 pts/1 00:00:00 nginx: master process nginx -g daemon off; 101 1929 1907 0 09:40 pts/1 00:00:00 nginx: worker process
殺掉容器:
docker kill [OPTIONS] CONTAINER [CONTAINER...] 殺掉一個或多個正在運行的容器
示例:
[root@centos7 ~]# docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2a1c58409cc1 centos "/bin/bash" 7 seconds ago Up 6 seconds centos01 [root@centos7 ~]# docker kill centos01 centos01 [root@centos7 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2a1c58409cc1 centos "/bin/bash" 16 seconds ago Exited (137) 2 seconds ago centos01
重啓容器:
docker restart [OPTIONS] CONTAINER [CONTAINER...] 重啓一個或多個容器
示例:
[root@centos7 ~]# docker restart centos01 centos01 [root@centos7 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2a1c58409cc1 centos "/bin/bash" About a minute ago Up 5 seconds centos01
補充:
跟前篇一致,上面都是docker 1.12版本之前的命令,在docker 1.13版對於容器管理也添加了新的命令集,其頂級命令爲docker container,包含如下命令:
attach 附加到容器(相當於docker attach)
commit 從一個修改的容器創建一個新的鏡像(相當於docker commit)
cp 在一個容器和本地文件系統中拷貝文件/目錄
create 創建一個新的容器
diff 檢查一個容器文件系統的修改
exec 在一個運行的容器中執行命令
export 將一個容器的文件系統導出爲tar包
inspect 顯示一個或多個容器的詳細信息
kill 殺掉一個或多個運行中的容器
logs 捕捉單個容器的日誌輸出
ls 列舉容器列表
pause 暫停一個或多個容器中的所有進程
port 列出容器中映射的端口
prune 移除所有停止的容器
rename 重命名一個容器
restart 重啓一個或多個容器
rm 刪除一個或多個容器
run 在一個新容器中運行一條命令
start 啓動一個或多個已停止的容器
stats 顯示一個或多個容器的動態資源統計
stop 停止一個或多個運行中的容器
top 顯示單個容器中運行的所有進程
unpause 取消暫停一個或多個容器中的所有進程
update 修改一個或多個容器的配置
wait 鎖定一個或多個容器,知道它們停止,然後打印它們的退出狀態碼
這其中,僅有1個命令是新增的,也就是docker container prune,因此僅對此進行說明,其他可以參照上面的命令。這裏並非不推薦使用Docker 1.13的命令,而是很多命令大家都用了很久習慣了,相反很推薦使用Docker 1.13的命令,因爲命令根據Docker對象進行了系統化,還是很有便捷性的。
移除所有停止的容器:
docker container prune [OPTIONS]
-f, --force 強制清除,不進行命令行確認
示例:
[root@centos7 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b3a3c06f9a75 centos "/bin/bash" 6 minutes ago Exited (0) 6 minutes ago centos03 f49e5ffa0a72 busybox "sh" 6 minutes ago Exited (0) 6 minutes ago busybox01 2a1c58409cc1 centos "/bin/bash" 36 minutes ago Up 35 minutes centos01 [root@centos7 ~]# docker container prune WARNING! This will remove all stopped containers. Are you sure you want to continue? [y/N] n Total reclaimed space: 0 B [root@centos7 ~]# docker container prune -f Deleted Containers: b3a3c06f9a7568790753f1ed54e37160ae0077908559e870c305c3bfaf936405 f49e5ffa0a7248320867563b5a849f13219e38024b25bc435d01038a2569f631 Total reclaimed space: 23 B [root@centos7 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2a1c58409cc1 centos "/bin/bash" 37 minutes ago Up 35 minutes centos01