上一篇我們學習了容器的啟動和常用的進入容器的方式,今天我們來看看如何控制容器起停以及容器删除操作。
一、stop、kill、start和restart
stop、kill指令都可以停止運作的容器,二者不同之處在于,stop是先給容器中的程序發送SIGTERM信号,一段時間後在發送SIGKILL信号,這樣可以讓程序在退出前做一些善後工作,這樣顯得更加優雅,而kill指令則是直接殺掉容器中的程序。
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
82b049e20195 ubuntu:18.04 "top -b" 4 days ago Up 6 minutes quizzical_hermann
:~$ sudo docker stop 82b049e20195
82b049e20195
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
82b049e20195 ubuntu:18.04 "top -b" 4 days ago Exited (0) 2 seconds ago quizzical_hermann
大家可以看到當執行stop指令時,容器狀态變為Exited。start指令就是讓處于Exited狀态的程序重新啟動,它能夠保留容器第一次啟動時執行的參數:
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
82b049e20195 ubuntu:18.04 "top -b" 4 days ago Exited (0) 2 seconds ago quizzical_hermann
$ sudo docker start 82b049e20195
82b049e20195
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
82b049e20195 ubuntu:18.04 "top -b" 4 days ago Up 2 seconds quizzical_hermann
restart指令是重新開機容器,本質上就是限制性stop在執行start指令,我們除了手動重新開機之外,在啟動容器時可以通過設定--restart參數,確定我們容器當出現錯誤而停止時能夠自動重新開機容器。
restart參數配置說明如下:
- no:預設政策,在容器退出時不重新開機容器
- on-failure:在容器非正常退出時(退出狀态非0),才會重新開機容器
- on-failure:3:在容器非正常退出時重新開機容器,最多重新開機3次
- always:在容器退出時總是重新開機容器
- unless-stopped:在容器退出時總是重新開機容器,但是不考慮在Docker守護程序啟動時就已經停止了的容器
$ sudo docker run -d --restart=always ubuntu:18.04 pwd
fb149d6e2bc1f07dece3410bfc62f5bcaf08f69bfef0bb65eaa205c2c9408bd3
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fb149d6e2bc1 ubuntu:18.04 "pwd" 8 seconds ago Restarting (0) 1 second ago heuristic_robinson
82b049e20195 ubuntu:18.04 "top -b" 4 days ago Up 4 minutes quizzical_hermann
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fb149d6e2bc1 ubuntu:18.04 "pwd" 11 seconds ago Restarting (0) Less than a second ago heuristic_robinson
82b049e20195 ubuntu:18.04 "top -b" 4 days ago Up 4 minutes quizzical_hermann
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fb149d6e2bc1 ubuntu:18.04 "pwd" 12 seconds ago Restarting (0) 2 seconds ago heuristic_robinson
82b049e20195 ubuntu:18.04 "top -b" 4 days ago Up 4 minutes quizzical_hermann
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fb149d6e2bc1 ubuntu:18.04 "pwd" 14 seconds ago Restarting (0) 3 seconds ago heuristic_robinson
82b049e20195 ubuntu:18.04 "top -b" 4 days ago Up 4 minutes quizzical_hermann
大家可以看到,當設定--restart=always時,隻要容器退出就會自動重新開機。
二、pause和unpause操作
有時候我們可能隻想讓容器暫停一會兒以便于做一些簡單維護性操作,這時候如果直接使用stop和start操作成本就太高了,這時我們可以使用pause和unpause指令,pause指令會暫停容器,此時容器不再使用CPU,隻有當執行unpause指令時,容器才恢複運作:
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
82b049e20195 ubuntu:18.04 "top -b" 4 days ago Up 5 minutes quizzical_hermann
$ sudo docker pause 82b049e20195
82b049e20195
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
82b049e20195 ubuntu:18.04 "top -b" 4 days ago Up 6 minutes (Paused) quizzical_hermann
$ sudo docker unpause 82b049e20195
82b049e20195
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
82b049e20195 ubuntu:18.04 "top -b" 4 days ago Up 6 minutes quizzical_hermann
三、容器删除
當我們想要删除一個或多個容器時,可以使用rm指令,此指令參數不僅可以直接傳遞一個或多個容器ID,也可以通過傳遞表達式删除指定的某一類容器。
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
96c8a885dd0d ubuntu:18.04 "pwd" 7 seconds ago Exited (0) 6 seconds ago silly_bell
4f43afe0f4b9 ubuntu:18.04 "pwd" 8 seconds ago Exited (0) 7 seconds ago recursing_mirzakhani
c66c61850c2c ubuntu:18.04 "pwd" 9 seconds ago Exited (0) 8 seconds ago naughty_kapitsa
386d785528fd ubuntu:18.04 "pwd" 10 seconds ago Exited (0) 9 seconds ago elated_chandrasekhar
91aec302789d ubuntu:18.04 "pwd" 11 seconds ago Exited (0) 10 seconds ago modest_cori
038ac31cf1cf ubuntu:18.04 "pwd" 11 seconds ago Exited (0) 10 seconds ago recursing_northcutt
e3fbc064330e ubuntu:18.04 "pwd" 12 seconds ago Exited (0) 11 seconds ago compassionate_mccarthy
46f8b71c40e8 ubuntu:18.04 "pwd" 14 seconds ago Exited (0) 13 seconds ago vibrant_swartz
82b049e20195 ubuntu:18.04 "top -b" 4 days ago Up 10 minutes quizzical_hermann
$ sudo docker rm 96c8a885dd0d
96c8a885dd0d
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4f43afe0f4b9 ubuntu:18.04 "pwd" 29 seconds ago Exited (0) 28 seconds ago recursing_mirzakhani
c66c61850c2c ubuntu:18.04 "pwd" 30 seconds ago Exited (0) 29 seconds ago naughty_kapitsa
386d785528fd ubuntu:18.04 "pwd" 31 seconds ago Exited (0) 30 seconds ago elated_chandrasekhar
91aec302789d ubuntu:18.04 "pwd" 32 seconds ago Exited (0) 31 seconds ago modest_cori
038ac31cf1cf ubuntu:18.04 "pwd" 32 seconds ago Exited (0) 31 seconds ago recursing_northcutt
e3fbc064330e ubuntu:18.04 "pwd" 33 seconds ago Exited (0) 32 seconds ago compassionate_mccarthy
46f8b71c40e8 ubuntu:18.04 "pwd" 35 seconds ago Exited (0) 34 seconds ago vibrant_swartz
82b049e20195 ubuntu:18.04 "top -b" 4 days ago Up 11 minutes quizzical_hermann
$ sudo docker rm 4f43afe0f4b9 c66c61850c2c
4f43afe0f4b9
c66c61850c2c
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
386d785528fd ubuntu:18.04 "pwd" 53 seconds ago Exited (0) 52 seconds ago elated_chandrasekhar
91aec302789d ubuntu:18.04 "pwd" 54 seconds ago Exited (0) 53 seconds ago modest_cori
038ac31cf1cf ubuntu:18.04 "pwd" 54 seconds ago Exited (0) 54 seconds ago recursing_northcutt
e3fbc064330e ubuntu:18.04 "pwd" 55 seconds ago Exited (0) 54 seconds ago compassionate_mccarthy
46f8b71c40e8 ubuntu:18.04 "pwd" 57 seconds ago Exited (0) 56 seconds ago vibrant_swartz
82b049e20195 ubuntu:18.04 "top -b" 4 days ago Up 11 minutes quizzical_hermann
$ sudo docker rm -v $(sudo docker ps -aq -f status=exited)
386d785528fd
91aec302789d
038ac31cf1cf
e3fbc064330e
46f8b71c40e8
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
82b049e20195 ubuntu:18.04 "top -b" 4 days ago Up 13 minutes quizzical_hermann
當然如果要删除所有退出的容器,也可以直接使用sudo docker rm $(sudo docker ps -a -q),雖然這個指令是要删除所有容器,但是運作中的容器一般是無法直接删除的,是以就可以確定隻删除Exited的容器。