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