containerd是容器虛擬化技術,從docker中剝離出來,形成開放容器接口(OCI)標准的一部分。
docker對容器的管理和操作基本都是通過containerd完成的。Containerd 是一個工業級標准的容器運行時,它強調簡單性、健壯性和可移植性。Containerd 可以在宿主機中管理完整的容器生命周期:容器鏡像的傳輸和存儲、容器的執行和管理、存儲和網絡等。詳細點說,Containerd 負責干下面這些事情:
•管理容器的生命周期(從創建容器到銷毀容器)
•拉取/推送容器鏡像
•存儲管理(管理鏡像及容器數據的存儲)
•調用 runC 運行容器(與 runC 等容器運行時交互)
•管理容器網絡接口及網絡
注意:Containerd 被設計成嵌入到一個更大的系統中,而不是直接由開發人員或終端用戶使用。
我們可以從下面幾點來理解為什么需要獨立的 containerd:
•繼續從整體 docker 引擎中分離出的項目(開源項目的思路)
•可以被 Kubernets CRI 等項目使用(通用化)
•為廣泛的行業合作打下基礎(就像 runC 一樣)
docker安裝后containerd默認已安裝,containerd包含如下命令組件:
•containerd:高性能容器運行時。
•ctr:containerd的命令行客戶端。
•runc:運行容器的命令行工具。
docker、containerd、docker-shim、runC關系:
docker:docker本身而言,包括了docker client和dockerd,dockerd實屬是對容器相關操作的api的最上層封裝,直接面向操作用戶。
containerd:dockerd實際真實調用的還是containerd的api接口(rpc方式實現),containerd是dockerd和runC之間的一個中間交流組件。
docker-shim:一個真實運行容器的載體,每啟動一個容器都會起一個新的docker-shim的進程。它通過指定三個參數:容器ID、boundle目錄(containerd對應某個容器生成目錄)、運行時二進制(默認是runC)來調用runC的api創建一個容器。
runC:一個命令行工具端,根據OCI的標准來創建和運行容器。
containerd應用
docker鏡像和containerd鏡像通用,但組織方式和存放目錄不同,導致docker與ctr命令不通用,各自管理自己的鏡像和容器。
此外k8s還有客戶端命令crictl,用法與docker基本相同,可crictl -h查看用法。
containerd的默認配置文件為/etc/containerd/config.toml,可通過命令:
containerd config default
輸出默認配置,可參考文檔https://github.com/containerd/containerd/blob/master/docs/ops.md
root = "/var/lib/containerd" state = "/run/containerd" oom_score = 0 ……
root鍵值用於存儲containerd持久化數據。
state鍵值用於存儲containerd臨時性數據,設備重啟后數據丟失。
顯示containerd鏡像
sudo ctr images ls
拉取hello-world鏡像
sudo ctr images pull docker.io/library/hello-world:latest
注:必須全路徑,從dockerhub上下載默認hello-world鏡像。
運行容器
sudo ctr run docker.io/library/hello-world:latestmy_hello-world
sudo ctr run -t docker.io/library/busybox:latestmybusybox_demosh
參考:
1.https://github.com/containerd/containerd
