【docker系列6】容器生命週期管理(下)

這是本專欄的第二部分:容器篇,共 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 的。

下圖展現了容器各類狀態間的切換關係,但願能對你有所幫助。

在這裏插入圖片描述

相關文章
相關標籤/搜索