一篇帶你弄懂Containerd vs Docker
引言
最近公司打算在新的產品中不再使用docker,而是使用containerd作為運行時。至于原因嘛,沒有直接告訴我們。于是,我就打算自己去了解一番;并與docker做個對比,看看兩者的差異。
介紹
docker相信大家已經非常熟悉了,我就不介紹了。這里來介紹一下containerd。github上針對containerd的介紹如下:
- containerd is an industry-standard container runtime with an emphasis on simplicity, robustness and portability.
- It is available as a daemon for Linux and Windows,
- which can manage the complete container lifecycle of its host system: image transfer and storage,
- container execution and supervision, low-level storage and network attachments, etc.
大致意思就是說Containerd是一個強調簡單性、健壯性和可移植性的行業標準容器運行時。可以在windows和linux上使用,能夠管理宿主機上容器整個生命周期,包括鏡像傳輸、容器創建和管理,低級別的存儲和網絡附件等等。其架構如下:
功能
使用過docker的朋友肯定對docker很熟悉了。這里就只說一下containerd的功能。containerd的功能如下:
- 支持 OCI 的鏡像標準
- OCI 的容器運行時
- 鏡像的推送和拉取
- 容器運行時生命周期管理
- 多租戶的鏡像存儲
- 網絡管理以及網絡 namespace 管理,支持容器網絡加入已有的 namespace
對比
接下來,對docker和containerd進行一個多方面的比較。看看兩者究竟有哪些缺別,也幫助大家以后進行選擇合適的去用。
調用鏈
在使用k8s時,使用docker和containerd的調用鏈如下所示:
不難看出,使用containerd時,調用鏈更短,不再需要經過dockershim和docker
數據目錄
相信大家都知道docker的數據目錄默認是在/var/lib/docker目錄下;而切換到containerd時,數據目錄默認為/var/lib/containerd
日志
當我們在使用k8s時,如果使用了docker作為運行時,其實容器程序日志的落盤是由docker來負責的。/var/log/pod和/var/log/container下的日志文件會軟連接到/var/lib/docker下對應的日志文件,如果還需要對日志做一些參數配置,直接修改docker配置文件即可;而如果我們現在使用containerd作為運行時,則容器日志的落盤將由kubelet來負責,/var/log/container下的日志文件會軟連接到/var/log/pod下的日志文件,如果需要調整日志參數,則需要修改kubelet相關配置
CNI
當使用docker作為運行時時,kubelet中的docker-shim負責調用cni;而當使用containerd作為運行時時,containerd中內置的containerd-cri負責調用cni
- [plugins."io.containerd.grpc.v1.cri".cni]
- bin_dir = "/opt/cni/bin"
- conf_dir = "/etc/cni/net.d"
流服務
熟悉k8s的朋友都知道,kubectl exec 和 kubelet log等命令需要通過apiserver與容器通信,這其中就涉及到了流服務。而docker API本身支持,kubelet中的docker-shim通過docker API流轉發;但containerd卻要對此進行單獨配置
- [plugins."io.containerd.grpc.v1.cri"]
- stream_idle_timeout = "4h0m0s"
- stream_server_address = "127.0.0.1"
- stream_server_port = "0"
- enable_tls_streaming = false
命令
使用containerd作為運行時后,常用的命令也變了。下面舉兩個例子。另外,使用containerd時,可以安裝nerdctl工具配合containerd的namespace來一起使用,這樣就跟使用docker命令一樣了
命名空間
containerd引入了namespace。名稱空間允許多個使用者使用同一容器,彼此之間不會發生沖突。它的優點是可以共享內容,但仍然與容器和鏡像分離。所以,在使用containerd相關命令時,需要添加-n namespace參數。
- Namespaces allow multiple consumers to use the same containerd without conflicting with each other.
- It has the benefit of sharing content but still having separation with containers and images.
總結
總體來看,containerd與docker還是有很多不同之處,但最終要實現的效果都一致。至于我們在使用k8s過程中,具體使用哪一種作為運行時,還是根據實際情況選擇。
參考
https://github.com/containerd/containerd
本文轉載自微信公眾號「運維開發故事」