圖解 Docker 常用命令工作原理

運維之美2018-07-18 09:33:00

Dokcer 常用命令工作原理

  • Docker 常用命令工作原理圖





鏡像可以看成是由多個鏡像層疊加起來的一個,鏡像層也可以簡單理解為一個基本的鏡像,而每個鏡像層之間通過指針的形式進行疊加。

根據上圖,鏡像層的主要組成部分包括鏡像層 ID、鏡像層指針 「指向父層」、元數據「 Layer Metadata,包含了 Docker 構建和運行的信息和父層的層次信息」。

只讀層和讀寫層「Top Layer」的組成部分基本一致,同時讀寫層可以轉換成只讀層「 通過docker commit 操作實現」。

  • Image(鏡像,只讀層的集合)

鏡像是一堆只讀層的統一視角,除了最底層沒有指向外,每一層都指向它的父層。統一文件系統( Union File System)技術能夠將不同的層整合成一個文件系統,為這些層提供了一個統一的視角,這樣就隱藏了多層的存在。在用戶的角度看來,只存在一個文件系統。鏡像每一層都是不可寫的,都是隻讀層。


  • Container(容器,一層讀寫層+多層只讀層)

容器和鏡像的區別在於容器的最上面一層是讀寫層「Top Layer」,在這裡並沒有區分容器是否在運行。

運行狀態的容器「Running Container」是由一個可讀寫的文件系統「」+ 隔離的進程空間和其中的進程構成的。

隔離的進程空間中的進程可以對該讀寫層進行增刪改,運行狀態容器的進程操作都作用在該讀寫層上。每個容器只能有一個進程隔離空間。

Docker 常用命令說明

標識說明

  • Image(統一隻讀文件系統)

  • 靜態容器 (未運行的容器,統一可讀寫文件系統)

  • 動態容器(運行中的容器,進程空間(包括進程)+ 統一可讀寫文件系統)

命令說明

Docker 生命週期相關命令
  • docker create < image-id >

該命令即為在只讀文件系統上添加一層可讀寫層「Top Layer」,並生成可讀寫文件系統。該命令狀態下容器為靜態容器,並沒有運行。

  • docker start | restart < container-id >

該命令即為在可讀寫文件系統添加一個進程空間和運行的進程,並生成一個動態容器。

docker stop 即為 docker start 的逆過程。

  • docker run < image-id >

docker run = docker create + docker start

docker run 流程類似如下:

  • docker stop < container-id >


該指令向運行中的容器發一個 SIGTERM 信號,然後停止所有的進程。即為 docker start 的逆過程。

  • docker kill < container-id >

該指令向容器發送一個不友好的 SIGKILL 信號,相當於快速強制關閉容器。與 docker stop 的區別是 docker stop 是先發 SIGTERM 信號來清理進程,然後再發 SIGKILL 信號退出,整個進程是正常關閉的。

  • docker pause < container-id >

該指令用作暫停容器中的所有進程,使用 cgroup 的 freezer 順序暫停容器裡的所有進程。

docker unpause 為其逆過程即恢復所有進程,比較少使用。

  • docker commit < container-id >



該指令用作把容器的可讀寫層轉化成只讀層,即從容器狀態「可讀寫文件系統」變為鏡像狀態「只讀文件系統」,可理解為固化。

  • docker build





docker build = docker run 「運行容器 + 進程修改數據」+ docker commit「固化數據」,整個過程不斷循環直至生成所需鏡像。

  1. 循環一次便會形成一個新的層(新鏡像 = 原鏡像層 + 已固化的可讀寫層)

  2. docker build 過程一般通過 dockerfile 文件來實現。

Docker 查詢類命令

Docker 可查詢的對象有:image、container、image/container 中的數據、系統信息(包括容器數、鏡像數及其它)。

  • docker images

該指令用作列出鏡像的頂層鏡像(以頂層鏡像 ID 來表示整個完整鏡像),每個頂層鏡像下面隱藏多個鏡像層。

  • docker images -a


該指令用作列出鏡像的所有鏡像層。鏡像層的排序以每個頂層鏡像 ID 為首,依次列出每個鏡像下的所有鏡像層。

  • docker history < image-id >


該指令列出該鏡像 ID 下的所有歷史鏡像。

  • docker ps


該指令用作列出所有運行中的容器。

  • docker ps -a

該指令用作列出所有容器,包括靜態容器和動態容器。

  • docker inspect < container-id > or < image-id >

該指令用作提取出容器或鏡像中最頂層的元數據。

  • docker info

該指令用作顯示 Docker 系統信息,包括鏡像和容器數。

Docker 操作類命令
  • docker rm < container-id >

該指令用作移除容器,默認只能對靜態容器(非運行狀態的)進行移除。如果要移除運行中的容器,需要使用 -f(force) 參數,即:docker rm -f <container-id>

  • docker rmi < image-id >

該指令作用與 docker rm 類似,用作移除鏡像。

  • docker exec < running-container-id >

該指令用於在運行狀態的容器中執行一個新的進程。

  • docker export < container-id >

該指令用作持久化一個容器,會創建一個 tar 格式的文件。該文件移除了元數據和不必要的層,將多個層整合成了一個層,只保存了當前統一視角看到的內容。

如果你要持久化一個鏡像,可以使用 docker save 指令。它與 docker export 的區別在於其保留了所有元數據和歷史層。

通過 docker export 導出的容器再 docker import 到 Docker 中後,在 docker images –tree 命令只能看到一個鏡像。而通過 docker save 保存後的鏡像則不同,它能夠看到這個鏡像構建過程中的所有歷史層。

docker exportdocker save 兩者更多的區別可參考「Docker 的 save 和 export 命令的區別」一文。

本文在 「Docker 常用命令原理圖」的基礎上整理和修改。

參考文檔

http://www.google.com
http://t.cn/RdC2419
http://t.cn/RUfqHh9


今日思想


Reading makes a full man, conference a ready man, and writing an exact man.

閱讀使人充實,交談使人機智,寫作使人精確。

——培根




更多精彩熱文:




閱讀原文

TAGS: