Containerd的安装和使用

安装
我的系统是 CentOS 7.9
安装 seccomp 依赖:
缺少依赖或依赖版本过低后面启动容器会报错

【报错原因】 缺少依赖包libseccomp(2.4以上版本)
【解决办法】 安装libseccomp 2.5.1
# 查看是否安装libseccomprpm -qa |grep libseccomp
# 卸载2.3.1版本yum remove libseccomp -y
# 安装2.5.1wget http://rpmfind.net/linux/centos/8-stream/BaseOS/x86_64/os/Packages/libseccomp-2.5.1-1.el8.x86_64.rpmrpm -ivh libseccomp-2.5.1-1.el8.x86_64.rpm安装Containerd
由于 containerd 需要调用 runc,所以需要先安装 runc,不过 containerd 提供了一个包含相关依赖的压缩包 cri-containerd-cni-${VERSION}.${OS}-${ARCH}.tar.gz,可以直接使用这个包来进行安装。release页面
yum install -y wget
wget https://github.com/containerd/containerd/releases/download/v1.7.7/cri-containerd-cni-1.7.7-linux-amd64.tar.gz# 如果有限制,也可以替换成下面的 URL 加速下载# wget https://download.fastgit.org/containerd/containerd/releases/download/v1.7.7/cri-containerd-cni-1.7.7-linux-amd64.tar.gz可以通过 tar 的 -t 选项直接看到压缩包中包含哪些文件:
tar -tf cri-containerd-cni-1.7.7-linux-amd64.tar.gz
cri-containerd.DEPRECATED.txtetc/etc/cni/etc/cni/net.d/etc/cni/net.d/10-containerd-net.conflistetc/crictl.yamletc/systemd/etc/systemd/system/etc/systemd/system/containerd.serviceusr/usr/local/usr/local/sbin/usr/local/sbin/runcusr/local/bin/usr/local/bin/ctd-decoderusr/local/bin/critestusr/local/bin/containerd-shim-runc-v1usr/local/bin/containerd-stressusr/local/bin/containerd-shim-runc-v2usr/local/bin/containerdusr/local/bin/containerd-shimusr/local/bin/ctrusr/local/bin/crictlopt/opt/cni/opt/cni/bin/opt/cni/bin/host-deviceopt/cni/bin/macvlanopt/cni/bin/host-localopt/cni/bin/vlanopt/cni/bin/bandwidthopt/cni/bin/tuningopt/cni/bin/dhcpopt/cni/bin/ptpopt/cni/bin/portmapopt/cni/bin/dummyopt/cni/bin/vrfopt/cni/bin/loopbackopt/cni/bin/staticopt/cni/bin/ipvlanopt/cni/bin/firewallopt/cni/bin/bridgeopt/cni/bin/sbropt/containerd/opt/containerd/cluster/opt/containerd/cluster/gce/opt/containerd/cluster/gce/envopt/containerd/cluster/gce/cloud-init/opt/containerd/cluster/gce/cloud-init/master.yamlopt/containerd/cluster/gce/cloud-init/node.yamlopt/containerd/cluster/gce/cni.templateopt/containerd/cluster/gce/configure.shopt/containerd/cluster/version将压缩包解压到系统目录
tar -C / -xzf cri-containerd-cni-1.7.7-linux-amd64.tar.gz将 /usr/local/bin 和 /usr/local/sbin 追加到 ~/.bashrc 文件的 PATH 环境变量中
vim ~/.bashrc
# 将下面这行代码追加到文件最后一行export PATH=$PATH:/usr/local/bin:/usr/local/sbin立即生效
source ~/.bashrccontainerd 的默认配置文件为 /etc/containerd/config.toml,通过命令生成一个默认的配置
mkdir -p /etc/containerdcontainerd config default > /etc/containerd/config.toml- version =2 :这个是新本版基本默认的选项。
- root:containerd保存元数据的地方。
- state: containerd的状态目录,重启数据就会刷新,就一个临时目录。
- address: 这个指的是containerd监听的套接字。
- plugins: 其中sandbox_image配置的是cni的插件,
- 以及配置的cni的二进制目录和初始化目录;还有配置的私有库的地址,证书,访问的用户密码
- path: container的二进制文件路径
- interval
- runtime:这部分配置需要的运行时runc,containerd-shim这个垫片可以选择用或者不用
下载的 containerd 压缩包中包含一个 etc/systemd/system/containerd.service 的文件,这样我们就可以通过 systemd 来配置 containerd 作为守护进程运行了,内容如下
cat /etc/systemd/system/containerd.service
# Copyright The containerd Authors.## Licensed under the Apache License, Version 2.0 (the "License");# you may not use this file except in compliance with the License.# You may obtain a copy of the License at## http://www.apache.org/licenses/LICENSE-2.0## Unless required by applicable law or agreed to in writing, software# distributed under the License is distributed on an "AS IS" BASIS,# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.# See the License for the specific language governing permissions and# limitations under the License.
[Unit]Description=containerd container runtimeDocumentation=https://containerd.ioAfter=network.target local-fs.target
[Service]#uncomment to enable the experimental sbservice (sandboxed) version of containerd/cri integration#Environment="ENABLE_CRI_SANDBOXES=sandboxed"ExecStartPre=-/sbin/modprobe overlayExecStart=/usr/local/bin/containerd
Type=notifyDelegate=yesKillMode=processRestart=alwaysRestartSec=5# Having non-zero Limit*s causes performance problems due to accounting overhead# in the kernel. We recommend using cgroups to do container-local accounting.LimitNPROC=infinityLimitCORE=infinityLimitNOFILE=infinity# Comment TasksMax if your systemd version does not supports it.# Only systemd 226 and above support this version.TasksMax=infinityOOMScoreAdjust=-999
[Install]WantedBy=multi-user.target这里有两个重要的参数:
Delegate: 这个选项允许 containerd 以及运行时自己管理自己创建容器的 cgroups。如果不设置这个选项,systemd 就会将进程移到自己的 cgroups 中,从而导致 containerd 无法正确获取容器的资源使用情况。KillMode: 这个选项用来处理 containerd 进程被杀死的方式。默认情况下,systemd 会在进程的 cgroup 中查找并杀死 containerd 的所有子进程。KillMode 字段可以设置的值如下。control-group(默认值):当前控制组里面的所有子进程,都会被杀掉process:只杀主进程mixed:主进程将收到 SIGTERM 信号,子进程收到 SIGKILL 信号none:没有进程会被杀掉,只是执行服务的 stop 命令
需要将 KillMode 的值设置为 process,这样可以确保升级或重启 containerd 时不杀死现有的容器。
启动Containerd 并设置成开机启动
systemctl enable containerd --now查看和验证
启动完成后就可以使用 containerd 的本地 CLI 工具 ctr 了,比如查看版本
ctr -vctr version
配置文件解析
生成的默认配置文件/etc/containerd/config.toml
每一个顶级配置块的命名都是 plugins."io.containerd.xxx.vx.xxx" 这种形式,每一个顶级配置块都表示一个插件,其中 io.containerd.xxx.vx 表示插件的类型,vx 后面的 xxx 表示插件的 ID,我们可以通过 ctr 查看插件列表:
ctr plugin ls
顶级配置块下面的子配置块表示该插件的各种配置,比如 cri 插件下面就分为 containerd、cni 和 registry 的配置,而 containerd 下面又可以配置各种 runtime,还可以配置默认的 runtime。比如现在我们要为镜像配置一个加速器,那么就需要在 cri 配置块下面的 registry 配置块下面进行配置 registry.mirrors:
[plugins."io.containerd.grpc.v1.cri".registry] [plugins."io.containerd.grpc.v1.cri".registry.mirrors] [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"] endpoint = ["https://akqgo94r.mirror.aliyuncs.com"] [plugins."io.containerd.grpc.v1.cri".registry.mirrors."k8s.gcr.io"] endpoint = ["https://registry.aliyuncs.com/k8sxio"]registry.mirrors."xxx": 表示需要配置 mirror 的镜像仓库,例如registry.mirrors."docker.io"表示配置 docker.io 的 mirror。endpoint: 表示提供 mirror 的镜像加速服务,比如我们可以注册一个阿里云的镜像服务来作为 docker.io 的 mirror。
另外在默认配置中还有两个关于存储的配置路径:
root = "/var/lib/containerd"state = "/run/containerd"其中 root 是用来保存持久化数据,包括 Snapshots, Content, Metadata 以及各种插件的数据,每一个插件都有自己单独的目录,Containerd 本身不存储任何数据,它的所有功能都来自于已加载的插件。
而另外的 state 是用来保存运行时的临时数据的,包括 sockets、pid、挂载点、运行时状态以及不需要持久化的插件数据。
Containerd的使用
-
帮助
Terminal window ctr
image-20231015224611650 -
拉取镜像
拉取镜像可以使用
ctr image pull来完成,比如拉取 Docker Hub 官方镜像nginx:alpine,需要注意的是镜像地址需要加上docker.ioHost 地址Terminal window ctr image pull docker.io/library/nginx:alpine
image-20231015224830196 -
镜像列表
images可以简写成image或者直接简写成ilist可以简写成lsTerminal window ctr images listctr image listctr i listctr images lsctr image lsctr i ls
image-20231015225437782 使用
-q(--quiet)选项可以只打印镜像名称Terminal window ctr images list -qctr image list -qctr i list -qctr images ls -qctr image ls -qctr i ls -q
image-20231015225642753 -
检测本地镜像
主要查看其中的
STATUS,complete表示镜像是完整可用的状态Terminal window ctr i check
image-20231015225748148 -
重新打Tag
Terminal window ctr image tag docker.io/library/nginx:alpine harbor.k8s.local/tianch/nginx:alpine
image-20231015225953125 
image-20231015230027828 -
删除镜像
不需要使用的镜像也可以使用
ctr image rm进行删除Terminal window ctr image rm harbor.k8s.local/tianch/nginx:alpine
image-20231015230146446 加上
--sync选项可以同步删除镜像和所有相关的资源 -
将镜像挂载到主机目录
Terminal window ctr image mount docker.io/library/nginx:alpine /mnttree -L 1 /mnt没有tree命令使用yum安装一下
Terminal window yum install -y tree
image-20231015230356220 -
将镜像从主机目录卸载
Terminal window ctr image unmount /mnt
image-20231015230633929 -
镜像导出
Terminal window ctr image export --all-platforms nginx.tar.gz docker.io/library/nginx:alpine可能会出现类似于
ctr: content digest sha256:xxxxxx not found的错误,解决办法需要 pull 所有平台镜像
image-20231015230924372 Terminal window ctr i pull --all-platforms docker.io/library/nginx:alpine再重新执行导出命令

image-20231015231153565 -
镜像导入
Terminal window ctr i import nginx.tar.gz
image-20231015231648205 -
创建容器
containers可以简写为container或者cTerminal window ctr c create docker.io/library/nginx:alpine nginx -
容器列表
Terminal window ctr c ls同样可以加上
-q选项精简列表内容
image-20231015232054569 -
查看容器详细配置
类似于
docker inspect功能Terminal window ctr c info nginx -
删除容器
rm也可换成removedeletedelTerminal window ctr c rm nginx
image-20231015232301141 -
启动容器
tasks可以写成task或者t通过
container create命令创建的容器,并没有处于运行状态,只是一个静态的容器。一个 container 对象只是包含了运行一个容器所需的资源及相关配置数据,表示 namespaces、rootfs 和容器的配置都已经初始化成功了,只是用户进程还没有启动。一个容器真正运行起来是由 Task 任务实现的,Task 可以为容器设置网卡,还可以配置工具来对容器进行监控等。
Task 相关操作可以通过
ctr task获取,如下我们通过 Task 来启动容器Terminal window ctr task start -d nginx
image-20231015233813044 -
进入容器
Terminal window ctr task exec -t --exec-id 0 nginx sh
image-20231015234004576 必须要指定
--exec-id参数,这个 id 可以随便写,只要唯一就行 -
暂停容器
和
docker pause类似Terminal window ctr task pause nginx
image-20231015234137929 -
恢复容器
Terminal window ctr task resume nginx
image-20231015234228568 ctr 没有 stop 容器的功能,只能暂停或者kill掉容器
-
杀掉容器
Terminal window ctr task kill nginx
image-20231015234414953 -
限额与使用量
Terminal window ctr task metrics nginx
image-20231015235005852 还可以使用
task ps命令查看容器中所有进程在宿主机中的 PIDTerminal window ctr t ps nginx
image-20231015235111771 其中第一个 PID 就是容器中的 1 号进程
命名空间
namespaces可以简写成namespace ns 如果不指定,ctr 默认使用的是 default 空间
Docker 其实也是默认调用的 containerd,事实上 Docker 使用的 containerd 下面的命名空间默认是 moby,而不是 default,所以用 docker 启动容器,可以通过 ctr -n moby 来定位下面的容器
ctr -n moby container ls
同样 Kubernetes 下使用的 containerd 默认命名空间是 k8s.io,所以我们可以使用 ctr -n k8s.io 来查看 Kubernetes 下面创建的容器
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!






