這是本專欄的第二部分:容器篇,共 6 篇,幫助你們由淺入深地認識和掌握容器。上一篇和本篇,我會爲你介紹容器生命週期管理相關的內容,帶你掌握容器生命週期。下面咱們一塊兒進入第二篇的內容,主要涉及容器狀態的變化。git
上一篇已經介紹了容器的建立,暫停以及中止等操做,而且通常狀況下即便容器被 stop 掉它仍然存在於機器上,經過docker ps -a
仍然能夠查看到其記錄,而且可隨時經過 docker start 將其從 Exited 的狀態更換爲 Running。github
那如何能夠刪除掉一個不須要的已經中止的容器呢?redis
使用 docker rm 便可。docker
仍然以一個實際例子入手:shell
(MoeLove) ➜ ~ docker run -d redis 516b4ac5d642e9766e40f5b41e4b8bbf3ebfcfcc8bd134dfea94a533678e8800 # 查詢容器狀態 (MoeLove) ➜ ~ docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 516b4ac5d642 redis "docker-entrypoint.s…" 5 seconds ago Up 4 seconds 6379/tcp silly_merkle
先中止該容器,而後對它作刪除操做:tcp
# 中止該容器 (MoeLove) ➜ ~ docker stop $(docker ps -ql) do516b4ac5d642 # 查詢狀態已經爲 Exited (MoeLove) ➜ ~ docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 516b4ac5d642 redis "docker-entrypoint.s…" 2 minutes ago Exited (0) 5 seconds ago silly_merkle # 刪除容器 (MoeLove) ➜ ~ docker rm 516b4ac5d642 516b4ac5d642 # 驗證查詢無結果 (MoeLove) ➜ ~ docker ps -a |grep 516b4ac5d642 (MoeLove) ➜ ~
是否還有其餘方式呢?spa
有,能夠在docker run
或者docker create
時,傳遞--rm
的選項,以便在容器退出時可自動刪除。rest
(MoeLove) ➜ ~ docker create --rm redis 998381d619b2e105043b169a2abb635d3ad8594c68fff52cbf5decb38496d80b (MoeLove) ➜ ~ docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 998381d619b2 redis "docker-entrypoint.s…" 4 seconds ago Created awesome_black (MoeLove) ➜ ~ docker start $(docker ps -ql) 998381d619b2 (MoeLove) ➜ ~ docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 998381d619b2 redis "docker-entrypoint.s…" 21 seconds ago Up 1 second 6379/tcp awesome_black (MoeLove) ➜ ~ docker stop $(docker ps -ql) 998381d619b2 (MoeLove) ➜ ~ docker ps -a |grep 998381d619b2
除此以外還有更方便的方式嗎?code
有,能夠用docker container prune
直接批量刪除所有已經中止的容器。component
(MoeLove) ➜ ~ docker container prune WARNING! This will remove all stopped containers. Are you sure you want to continue? [y/N] y
當輸入docker container prune
後,會有個提示,輸入 y 確認,則開始刪除所有已中止的容器。
源碼中的容器狀態
前面的內容都是經過實踐,讓你體驗到了如何管理容器的生命週期,如今咱們深刻源碼來看看在源碼中容器的狀態。
關於容器狀態相關的代碼都在container/state.go
func (s *State) StateString() string { if s.Running { if s.Paused { return "paused" } if s.Restarting { return "restarting" } return "running" } if s.RemovalInProgress { return "removing" } if s.Dead { return "dead" } if s.StartedAt.IsZero() { return "created" } return "exited" }
能夠看到其中的 Created、Running、Paused、Exited 等狀態,在前面的實驗中都已經接觸過了,沒有涉及到的狀態包括 Dead、 Removing 和 Restarting,其實 Removing 咱們也算接觸過了,前面的docker rm
執行過程當中便會將容器狀態設置爲 Removing,只不過過程比較快,因此不容易捕獲到。
至於 Restarting 狀態,是在docker run
或者docker create
可經過傳遞--restart
參數來設置重啓策略,在容器執行異常,或是 Docker 後臺進程重啓之類的狀況下,會按照重啓策略進行重啓。
最後就是 Dead 狀態了,這個狀態多數時候是個中間狀態,好比要刪除容器的時候,會將其狀態設置爲 Dead,可是當刪除過程失敗,則容器會保持 Dead 狀態了。
本篇介紹了容器的刪除操做,以及經過源碼展現了容器幾種狀態的關係:Paused 和 Restarting 時,容器的實際表現實際上是在 Running 的。
下圖展現了容器各類狀態間的切換關係,但願能對你有所幫助。