一文带你掌握Containerd

2023-12-28 17:47:29 浏览数 (1)

Containerd 是什么

Containerd是一个开源的容器运行时工具,它为容器提供了核心功能。作为一个独立的项目,Containerd旨在管理容器的核心功能,如镜像管理、容器生命周期管理、网络和存储管理等。它是由Docker项目中的核心组件分离出来的,用于提供一个更加轻量级、独立且可嵌入的容器运行时环境。Containerd被设计为一个通用的核心容器运行时,因此许多容器平台和工具都可以构建在其之上,包括Kubernetes、Docker等。Containerd并不是直接面向终端用户的工具,而是为了提供稳定、可靠的容器基础设施,让开发者和其他项目可以基于它构建更高级别的容器化解决方案。

与 Docker 的关系

Docker和Containerd之间有一种父子关系。Containerd实际上是从Docker项目中拆分出来的,是Docker引擎中的核心组件之一。具体来说,Docker Engine在其架构中使用了一种插件化的方式,而Containerd就是其中一个重要的组件。Docker Engine的架构涵盖了各种功能模块,其中包括容器构建、镜像管理、容器运行时、网络和存储管理等。Containerd被用作Docker Engine中负责容器生命周期管理和基本操作的核心组件之一。因此,Docker实际上是建立在Containerd之上的应用层工具。当你使用Docker命令时,它会与Containerd交互以执行诸如创建、运行和管理容器等操作。然而,Containerd本身更加通用和抽象化,可以为其他容器平台和工具提供底层支持,而不仅限于Docker。总体而言,Docker是一个集成了各种工具和功能的容器平台,而Containerd是其中一个核心组件,负责提供基本的容器运行时功能。

安装Containerd

系统信息

代码语言:javascript复制
[root@localhost ~]# cat /etc/redhat-release 
CentOS Linux release 7.2.1511 (Core)

二进制安装

下载地址?https://github.com/containerd/containerd最新版本1.7.10

代码语言:javascript复制
[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配置

代码语言:javascript复制
[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、挂载点、运行时状态以及不需要持久化的插件数据。

Containerd开机自启

代码语言:javascript复制
[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 命令

代码语言:javascript复制
执行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安装

代码语言:javascript复制
[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

做软链

代码语言:javascript复制
[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

代码语言:javascript复制
[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安装

在使用 yum 包管理器安装 Containerd 之前,需要先设置 Containerd 的 YUM 仓库。以下是大致的步骤:

准备YUM 仓库

创建一个名为 /etc/yum.repos.d/containerd.repo 的文件,并将以下内容添加到该文件中:

代码语言:javascript复制
[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 缓存并使其识别新的仓库信息:

代码语言:javascript复制
[root@localhost ~]# yum makecache
[root@localhost ~]# yum install -y containerd.io

启动 Containerd

代码语言:javascript复制
[root@localhost ~]# systemctl enable containerd
[root@localhost ~]# systemctl start containerd

验证 Containerd

代码语言:javascript复制
[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 接口规范的一个命令行工具,通常用它来检查和管理kubelet节点上的容器运行时和镜像。
  • ctr 是 containerd 的一个客户端工具。

还有一个更高级点的命令 nerdctl ,nerdctl 是用于 containerd 并且 兼容 docker cli 习惯的管理工具,主要适用于刚从 docker 转到 containerd 的用户,操作 containerd 的命令行工具 ctr 和 crictl 不怎么好用,所以就有了 nerdctl。

0 人点赞