Containerd是一个开源的容器运行时工具,它为容器提供了核心功能。作为一个独立的项目,Containerd旨在管理容器的核心功能,如镜像管理、容器生命周期管理、网络和存储管理等。它是由Docker项目中的核心组件分离出来的,用于提供一个更加轻量级、独立且可嵌入的容器运行时环境。Containerd被设计为一个通用的核心容器运行时,因此许多容器平台和工具都可以构建在其之上,包括Kube.NETes、Docker等。Containerd并不是直接面向终端用户的工具,而是为了提供稳定、可靠的容器基础设施,让开发者和其他项目可以基于它构建更高级别的容器化解决方案。
Docker和Containerd之间有一种父子关系。Containerd实际上是从Docker项目中拆分出来的,是Docker引擎中的核心组件之一。具体来说,Docker Engine在其架构中使用了一种插件化的方式,而Containerd就是其中一个重要的组件。Docker Engine的架构涵盖了各种功能模块,其中包括容器构建、镜像管理、容器运行时、网络和存储管理等。Containerd被用作Docker Engine中负责容器生命周期管理和基本操作的核心组件之一。因此,Docker实际上是建立在Containerd之上的应用层工具。当你使用Docker命令时,它会与Containerd交互以执行诸如创建、运行和管理容器等操作。然而,Containerd本身更加通用和抽象化,可以为其他容器平台和工具提供底层支持,而不仅限于Docker。总体而言,Docker是一个集成了各种工具和功能的容器平台,而Containerd是其中一个核心组件,负责提供基本的容器运行时功能。
[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 /
[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配置的目录是用来保存持久化数据的目录,包括content, snapshot, metadata和runtime
state 是用来保存运行时的临时数据的,包括 sockets、pid、挂载点、运行时状态以及不需要持久化的插件数据。
[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
默认 Containerd 安装好就会自带一个 runc 命令
执行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
执行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 包管理器安装 Containerd 之前,需要先设置 Containerd 的 YUM 仓库。以下是大致的步骤:
创建一个名为 /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
在设置好仓库文件后,运行以下命令以更新 YUM 缓存并使其识别新的仓库信息:
[root@localhost ~]# yum makecache
[root@localhost ~]# yum install -y containerd.io
[root@localhost ~]# systemctl enable containerd
[root@localhost ~]# systemctl start 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 后,以往常用的 docker 命令也不再使用,取而代之的分别是 crictl 和 ctr 两个命令客户端。一般来说某个主机安装了 k8s 后,命令行才会有 crictl 命令。而 ctr 是跟 k8s 无关的,主机安装了 containerd 服务后就可以操作 ctr 命令。
还有一个更高级点的命令 nerdctl ,nerdctl 是用于 containerd 并且 兼容 docker cli 习惯的管理工具,主要适用于刚从 docker 转到 containerd 的用户,操作 containerd 的命令行工具 ctr 和 crictl 不怎么好用,所以就有了 nerdctl。