一文帶你掌握Containerd
Containerd 是什么
Containerd是一個開源的容器運行時工具,它為容器提供了核心功能。作為一個獨立的項目,Containerd旨在管理容器的核心功能,如鏡像管理、容器生命周期管理、網絡和存儲管理等。它是由Docker項目中的核心組件分離出來的,用于提供一個更加輕量級、獨立且可嵌入的容器運行時環(huán)境。Containerd被設計為一個通用的核心容器運行時,因此許多容器平臺和工具都可以構建在其之上,包括Kubernetes、Docker等。Containerd并不是直接面向終端用戶的工具,而是為了提供穩(wěn)定、可靠的容器基礎設施,讓開發(fā)者和其他項目可以基于它構建更高級別的容器化解決方案。
與 Docker 的關系
Docker和Containerd之間有一種父子關系。Containerd實際上是從Docker項目中拆分出來的,是Docker引擎中的核心組件之一。具體來說,Docker Engine在其架構中使用了一種插件化的方式,而Containerd就是其中一個重要的組件。Docker Engine的架構涵蓋了各種功能模塊,其中包括容器構建、鏡像管理、容器運行時、網絡和存儲管理等。Containerd被用作Docker Engine中負責容器生命周期管理和基本操作的核心組件之一。因此,Docker實際上是建立在Containerd之上的應用層工具。當你使用Docker命令時,它會與Containerd交互以執(zhí)行諸如創(chuàng)建、運行和管理容器等操作。然而,Containerd本身更加通用和抽象化,可以為其他容器平臺和工具提供底層支持,而不僅限于Docker??傮w而言,Docker是一個集成了各種工具和功能的容器平臺,而Containerd是其中一個核心組件,負責提供基本的容器運行時功能。
安裝Containerd
系統(tǒng)信息
[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
二進制安裝
下載地址?https://github.com/containerd/containerd最新版本1.7.10
[root@localhost ~]# wget https://github.com/containerd/containerd/releases/download/v1.7.10/cri-containerd-1.7.10-linux-amd64.tar.gz
[root@localhost ~]# tar xf cri-containerd-1.7.10-linux-amd64.tar.gz -C /
生成Containerd配置
[root@localhost ~]# mkdir /etc/containerd
[root@localhost ~]# containerd config default > /etc/containerd/config.toml
查看配置
[root@localhost ~]# cat/etc/containerd/config.toml
安裝好containerd 之后,Containerd的配置文件中有如下兩項配置:
root = /var/lib/containerd
state = "/run/containerd"
root配置的目錄是用來保存持久化數(shù)據(jù)的目錄,包括content, snapshot, metadata和runtime
state 是用來保存運行時的臨時數(shù)據(jù)的,包括 sockets、pid、掛載點、運行時狀態(tài)以及不需要持久化的插件數(shù)據(jù)。
Containerd開機自啟
[root@localhost ~]# systemctl enable --now containerd
Created symlink from /etc/systemd/system/multi-user.target.wants/containerd.service to /etc/systemd/system/containerd.service.
[root@localhost ~]# systemctl start containerd
驗證其版本
[root@localhost ~]# containerd --version
containerd github.com/containerd/containerd v1.7.10 4e1fe7492b9df85914c389d1f15a3ceedbb280ac
runc驗證
默認 Containerd 安裝好就會自帶一個 runc 命令
執(zhí)行runc命令,如果有版本號返回則為正常
[root@localhost ~]# runc -v
runc version 1.1.10
commit: v1.1.10-0-g18a0cb0f
spec: 1.0.2-dev
go: go1.20.10
libseccomp: 2.5.4
如果運行runc命令時提示:runc: error while loading shared libraries: ?libseccomp.so.2: cannot open shared object file: No such file or directory,則表明runc沒有找到libseccomp,需要安裝 libseccomp libseccomp安裝
[root@localhost ~]# wget https://github.com/opencontainers/runc/releases/download/v1.1.5/libseccomp-2.5.4.tar.gz
[root@localhost ~]# tar xf libseccomp-2.5.4.tar.gz
[root@localhost ~]# cd libseccomp-2.5.4/
[root@localhost ~]# ./configure
[root@localhost ~]# make && make install
查找的到 即安裝成功
[root@localhost ~]# find / -name "libseccomp.so"
/root/libseccomp-2.5.4/src/.libs/libseccomp.so
/usr/local/lib/libseccomp.so
做軟鏈
[root@localhost ]# ln -s /usr/local/lib/libseccomp.so /lib64/libseccomp.so.2
再次查看
[root@localhost ]# runc -v
runc version 1.1.10
commit: v1.1.10-0-g18a0cb0f
spec: 1.0.2-dev
go: go1.20.10
libseccomp: 2.5.4
也可以二進制runc安裝?https://github.com/opencontainers/runc最新版本:1.1.10
[root@localhost ~]# wget https://github.com/opencontainers/runc/releases/download/v1.1.10/runc.amd64
[root@localhost ~]# chmod +x runc.amd64
查找containerd安裝時已安裝的runc所在的位置,然后替換
[root@localhost ~]# which runc /usr/local/sbin/runc
替換containerd已安裝的runc
[root@localhost ~]# mv runc.amd64 /usr/local/sbin/runc
執(zhí)行runc命令,如果有命令幫助則為正常
[root@localhost ~]# runc -v
runc version 1.1.10
commit: v1.1.10-0-g18a0cb0f
spec: 1.0.2-dev
go: go1.20.10
libseccomp: 2.5.4
yum安裝
在使用 yum 包管理器安裝 Containerd 之前,需要先設置 Containerd 的 YUM 倉庫。以下是大致的步驟:
準備YUM 倉庫
創(chuàng)建一個名為 /etc/yum.repos.d/containerd.repo 的文件,并將以下內容添加到該文件中:
[containerd]
name=containerd
baseurl=https://download.docker.com/linux/centos/7/$basearch/stable
gpgcheck=1
gpgkey=https://download.docker.com/linux/centos/gpg
enabled=1
安裝 Containerd
在設置好倉庫文件后,運行以下命令以更新 YUM 緩存并使其識別新的倉庫信息:
[root@localhost ~]# yum makecache
[root@localhost ~]# yum install -y containerd.io
啟動 Containerd
[root@localhost ~]# systemctl enable containerd
[root@localhost ~]# systemctl start containerd
驗證 Containerd
[root@localhost ~]# containerd -v
containerd containerd.io 1.6.25 d8f198a4ed8892c764191ef7b3b06d8a2eeb5c7f
[root@localhost ~]# runc -v
runc version 1.1.10
commit: v1.1.10-0-g18a0cb0
spec: 1.0.2-dev
go: go1.20.10
libseccomp: 2.3.1
Containerd 常見命令操作
更換 Containerd 后,以往常用的 docker 命令也不再使用,取而代之的分別是 crictl 和 ctr 兩個命令客戶端。一般來說某個主機安裝了 k8s 后,命令行才會有 crictl 命令。而 ctr 是跟 k8s 無關的,主機安裝了 containerd 服務后就可以操作 ctr 命令。
- crictl 是遵循 CRI 接口規(guī)范的一個命令行工具,通常用它來檢查和管理kubelet節(jié)點上的容器運行時和鏡像。
- ctr 是 containerd 的一個客戶端工具。
還有一個更高級點的命令 nerdctl ,nerdctl 是用于 containerd 并且 兼容 docker cli 習慣的管理工具,主要適用于剛從 docker 轉到 containerd 的用戶,操作 containerd 的命令行工具 ctr 和 crictl 不怎么好用,所以就有了 nerdctl。