Docker | Docker技術基礎梳理(三) - 容器生命週期管理

鹹魚普拉思發表於2019-01-21

Docker | Docker技術基礎梳理(三) - 容器生命週期管理

什麼是容器?

容器(Container):容器是一種輕量級、可移植、並將應用程式進行的打包的技術,使應用程式可以在幾乎任何地方以相同的方式執行,Docker將映象檔案執行起來後,產生的物件就是容器。容器相當於是映象執行起來的一個例項且容器具備一定的生命週期。

Docker容器和虛擬機器的區別

相同點:

  • 容器和虛擬機器一樣,都會對物理硬體資源進行共享使用。

  • 容器和虛擬機器的生命週期比較相似(建立、執行、暫停、關閉等等)。

  • 容器中或虛擬機器中都可以安裝各種應用,如redis、mysql、nginx等。也就是說,在容器中的操作,如同在一個虛擬機器(作業系統)中操作一樣。

  • 同虛擬機器一樣,容器建立後,會儲存在宿主機上:linux上位於/var/lib/docker/containers下

不同點:

  • 虛擬機器的建立、啟動和關閉都是基於一個完整的作業系統。一個虛擬機器就是一個完整的作業系統。而容器直接執行在宿主機的核心上,其本質上以一系列程式的結合。

  • 容器是輕量級的,虛擬機器是重量級的。首先容器不需要額外的資源來管理(不需要Hypervisor、Guest OS),虛擬機器額外更多的效能消耗;其次建立、啟動或關閉容器,如同建立、啟動或者關閉程式那麼輕鬆,而建立、啟動、關閉一個作業系統就沒那麼方便了。
    也因此,意味著在給定的硬體上能執行更多數量的容器,甚至可以直接把Docker執行在虛擬機器上。

容器的生命週期管理

先來看一張容器生命週期示意圖:

Docker | Docker技術基礎梳理(三) - 容器生命週期管理

下面鹹魚會對容器管理的部分命令簡要學習:

容器建立(docker create)

命令格式:
docker create [引數] 映象名稱[容器執行命令][執行命令時需要提供的引數]

常用引數:

-t 分配一個虛擬終端
-i 提供一個模擬輸入,不提供則無法輸入預設命令
--name 為建立好的容器提供一個容器名,不提供的話隨機分配一個

Docker | Docker技術基礎梳理(三) - 容器生命週期管理
容器啟動(docker start)

啟動一個或多個容器。

命令格式:docker start [引數] 容器[容器..]

常用引數:

-a 將當前的輸入/輸出連線到容器
-i 將當前的輸入連線到容器上
容器建立並啟動(docker run)

命令格式:
docker run [引數] 映象 [容器執行命令] [執行命令提供的引數]

常用引數:

-t 分配一個虛擬終端
-i 保持輸入開啟
-d 容器後臺執行,並列印容器id
--rm 容器結束後自動刪除容器

注意:因為我們學習docker主要還是為我們之後基於docker的Python開發服務的,所以關於docker run 以及 docker create/start 的一些引數的具體的區別就不在文章裡贅述,有疑問的朋友可以參考官方文件,當然也歡迎和鹹魚在留言區討論,大家在這裡簡單記兩個公式就好:

docker run = doker create + docker start -a
docker run -d = docker create + docker start

這裡鹹魚推薦大家使用docker run -dti來啟動所需容器。

容器暫停(docker pause/unpause)

docker pause 暫停一個或多個容器

docker unpause 啟動一個或多個暫停中的容器

命令格式:
docker pause/unpause 容器[容器..]

容器關閉(docker stop)

關閉一個或多個容器。

docker stop 關閉一個或多個容器

命令格式:
docker stop 容器[容器..]
常用引數:

-t 關閉前的等待時間,預設是10
容器終止(docker kill)

強制並立即關閉一個或多個處於暫停或執行狀態的容器。

命令格式:docker kill [引數] 容器[容器..]

常用引數:
-s 指定發給容器的關閉訊號,預設為“kill”

容器重啟(docker restart)

重啟一個或多個處於執行狀態、暫停狀態、關閉狀態或建立狀態的容器。

命令格式:
docker restart [引數] 容器[容器..]

常用引數:

-t 關閉前的等待時間,預設是10秒,實則是關閉前的等待時間
容器刪除(docker container rm / docker rm )

命令格式:docker container rm [引數] 容器[容器..]

常用引數:

-f 強制刪除
-v 刪除容器的同時刪除容器的資料卷
docker kill 和 docker stop 區別

在上面關於docker容器生命週期管理中stop 和 kill 都是關閉容器,但是其中的kill是怎麼實現強制殺死執行中的容器的呢?

這裡需要說明下關linux下關於終止程式的訊號:SIGTERM 和 SIGKILL

SIGKILL訊號:無條件終止程式訊號。程式接收到該訊號會立即終止,不進行清理和暫存工作。該訊號不能被忽略、處理和阻塞,它向系統管理員提供了可以殺死任何程式的方法。

SIGTERM訊號:程式終結訊號,可以由kill命令產生。與SIGKILL不同的是,SIGTERM訊號可以被阻塞和終止,以便程式在退出前可以儲存工作或清理臨時檔案等。

docker stop 會先發出SIGTERM訊號給程式,告訴程式即將會被關閉。在-t指定的等待時間過了之後,將會立即發出SIGKILL訊號,直接關閉容器。

docker kill 直接發出SIGKILL訊號關閉容器。但也可以透過-s引數修改發出的訊號。

docker restart 中同樣可以設定 -t 等待時間,當等待時間過後會立刻傳送SIGKILL訊號,直接關閉容器。

因此會發現在docker stop的等待過程中,如果終止docker stop的執行,容器最終沒有被關閉。而docker kill幾乎是立刻發生,無法撤銷。

總結

關於docker容器的生命週期管理,鹹魚踩坑之後認為需要加深理解的部分是關於docker run/start/create 以及 docker kill/stop/restart這兩大部分。

關於docker kill 和 docker stop 區別希望大家能著重看下上面docker kill/stop區別部分,至於docker run/start/create最好能夠動手敲一下感受下不同引數建立的後容器區別。

以上就是鹹魚關於容器生命週期管理部分的踩坑總結。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31556785/viewspace-2564296/,如需轉載,請註明出處,否則將追究法律責任。

相關文章