天天看點

Docker 與 K8S學習筆記(五)—— 容器的操作(下篇)

上一篇我們學習了容器的啟動和常用的進入容器的方式,今天我們來看看如何控制容器起停以及容器删除操作。

 一、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的容器。