Docker 架構中的幾個核心概念

  • 2019 年 12 月 18 日
  • 筆記

一、Docker 開源之路

2015 年 6 月 ,docker 公司將 libcontainer 捐出並改名為 runC 項目,交由一個完全中立的基金會管理,然後以 runC 為依據,大家共同制定一套容器和鏡像的標準和規範 OCI。

2016 年 4 月,docker 1.11 版本之後開始引入了 containerd 和 runC,Docker 開始依賴於 containerd 和 runC 來管理容器,containerd 也可以操作滿足 OCI 標準規範的其他容器工具,之後只要是按照 OCI 標準規範開發的容器工具,都可以被 containerd 使用起來。

從 2017 年開始,Docker 公司先是將 Docker項目的容器運行時部分 Containerd 捐贈給CNCF 社區,緊接著,Docker 公司宣布將 Docker 項目改名為 Moby。

二、Docker 架構

三、核心概念

docker 1.13 版本中包含以下幾個二進位文件。

$ docker --version  Docker version 1.13.1, build 092cba3    $ docker  docker             docker-containerd-ctr   dockerd      docker-proxy  docker-containerd  docker-containerd-shim  docker-init  docker-runc

1、docker

docker 的命令行工具,是給用戶和 docker daemon 建立通訊的客戶端。

2、dockerd

dockerd 是 docker 架構中一個常駐在後台的系統進程,稱為 docker daemon,dockerd 實際調用的還是 containerd 的 api 介面(rpc 方式實現),docker daemon 的作用主要有以下兩方面:

  • 接收並處理 docker client 發送的請求
  • 管理所有的 docker 容器

有了 containerd 之後,dockerd 可以獨立升級,以此避免之前 dockerd 升級會導致所有容器不可用的問題。

3、containerd

containerd 是 dockerd 和 runc 之間的一個中間交流組件,docker 對容器的管理和操作基本都是通過 containerd 完成的。containerd 的主要功能有:

  • 容器生命周期管理
  • 日誌管理
  • 鏡像管理
  • 存儲管理
  • 容器網路介面及網路管理

4、containerd-shim

containerd-shim 是一個真實運行容器的載體,每啟動一個容器都會起一個新的containerd-shim的一個進程, 它直接通過指定的三個參數:容器id,boundle目錄(containerd 對應某個容器生成的目錄,一般位於:/var/run/docker/libcontainerd/containerID,其中包括了容器配置和標準輸入、標準輸出、標準錯誤三個管道文件),運行時二進位(默認為runC)來調用 runc 的 api 創建一個容器,上面的 docker 進程圖中可以直觀的顯示。其主要作用是:

  • 它允許容器運行時(即 runC)在啟動容器之後退出,簡單說就是不必為每個容器一直運行一個容器運行時(runC)
  • 即使在 containerd 和 dockerd 都掛掉的情況下,容器的標準 IO 和其它的文件描述符也都是可用的
  • 向 containerd 報告容器的退出狀態

有了它就可以在不中斷容器運行的情況下升級或重啟 dockerd,對於生產環境來說意義重大。

5、runC

runC 是 Docker 公司按照 OCI 標準規範編寫的一個操作容器的命令行工具,其前身是 libcontainer 項目演化而來,runC 實際上就是 libcontainer 配上了一個輕型的客戶端,是一個命令行工具端,根據 OCI(開放容器組織)的標準來創建和運行容器,實現了容器啟停、資源隔離等功能。

一個例子,使用 runC 運行 busybox 容器:

# mkdir /container  # cd /container/  # mkdir rootfs    準備容器鏡像的文件系統,從 busybox 鏡像中提取  # docker export $(docker create busybox) | tar -C rootfs -xvf -  # ls rootfs/  bin  dev  etc  home  proc  root  sys  tmp  usr  var    有了rootfs之後,我們還要按照 OCI 標準有一個配置文件 config.json 說明如何運行容器,  包括要運行的命令、許可權、環境變數等等內容,runc 提供了一個命令可以自動幫我們生成  # docker-runc spec  # ls  config.json  rootfs  # docker-runc run simplebusybox    #啟動容器  / # ls  bin   dev   etc   home  proc  root  sys   tmp   usr   var  / # hostname  runc

參考: Use of containerd-shim in docker-architecture 從 docker 到 runC OCI 和 runc:容器標準化和 docker Open Container Initiative