共计 4724 个字符,预计需要花费 12 分钟才能阅读完成。
containerd 是容器虚拟化技术,从 docker 中剥离出来,形成开放容器接口(OCI)标准的一部分。
docker 对容器的管理和操作基本都是通过 containerd 完成的。Containerd 是一个工业级标准的容器运行时,它强调简单性、健壮性和可移植性。Containerd 可以在宿主机中管理完整的容器生命周期:容器镜像的传输和存储、容器的执行和管理、存储和网络等。详细点说,Containerd 负责干下面这些事情:
注意:Containerd 被设计成嵌入到一个更大的系统中,而不是直接由开发人员或终端用户使用。
docker 安装后 containerd 默认已安装,containerd 包含如下命令组件:
-
containerd:高性能容器运行时。
-
ctr:containerd 的命令行客户端。
-
runc:运行容器的命令行工具。
docker、containerd、docker-shim、runC 关系:
![Containerd 的安装和基本使用 Containerd 的安装和基本使用]()
/>
docker:docker 本身而言,包括了 docker client 和 dockerd,dockerd 实属是对容器相关操作的 api 的最上层封装,直接面向操作用户。
containerd:dockerd 实际真实调用的还是 containerd 的 api 接口(rpc 方式实现),containerd 是 dockerd 和 runC 之间的一个中间交流组件。
docker-shim:一个真实运行容器的载体,每启动一个容器都会起一个新的 docker-shim 的进程。它通过指定三个参数:容器 ID、boundle 目录(containerd 对应某个容器生成目录)、运行时二进制(默认是 runC)来调用 runC 的 api 创建一个容器。
runC:一个命令行工具端,根据 OCI 的标准来创建和运行容器。
搜索了 containerd 的相关安装教程,对于自己来说还是有点迷糊,决定自己整一遍在线和离线安装 containerd。
访问 containerd GitHub 仓库的 releases 页面 下载对应系统版本的 containerd 文件。
containerd 的运行是需要调用 runc 的,但是 containerd-x.x.x-linux-amd64.tar.gz 不包含 runc,所以需要直接下载完整版本。cri-containerd-x.x.x-linux-amd64.tar.gz,这个版本包含了所有 Kubernetes 需要的二进制文件。
# 下载
wget https://github.com/containerd/containerd/releases/download/v1.7.6/cri-containerd-1.7.6-linux-amd64.tar.gz
# 直接将压缩包解压到系统的各个目录中
tar -C / -zxvf cri-containerd-1.7.6-linux-amd64.tar.gz
# 追加环境变量并立即生效
export PATH=$PATH:/usr/local/bin:/usr/local/sbin && source ~/.bashrc
可执行文件有 containerd 和 ctr 等文件,ctr 是 containerd 提供的命令行工具,用于与 containerd 交互和管理容器运行时。通过 ctr 工具,你可以执行各种操作,如查看容器列表、启动和停止容器、管理镜像、查看容器日志等。
此时只是下载了二进制文件,还没有启动 containerd,所以使用 ctr image ls 命令会提示报错。
首先生成 containerd 运行所需要的配置文件,方便后期修改。
mkdir -p /etc/containerd/ && containerd config default > /etc/containerd/config.toml
启动 containerd 并设置自启动,默认刚刚解压的包是包含 /usr/lib/systemd/system/containerd.service 文件的。
systemctl start containerd && systemctl enable containerd
如果上面的命令报错,可以使用 find / -name *containerd.service* 命令查找一下,实在不行可以自己编写 containerd 的系统管理服务,编写后执行上面的命令即可。
cat > /usr/lib/systemd/system/containerd.service <<EOF
[Unit]
Description=containerd container runtime
Documentation=https://containerd.io
After=network.target
[Service]
ExecStartPre=/sbin/modprobe overlay
ExecStart=/usr/bin/containerd --config /etc/containerd/config.toml
Restart=always
RestartSec=5
LimitNOFILE=infinity
[Install]
WantedBy=multi-user.target
EOF
此时就可以执行 ctr image ls 命令。
在线安装就比较简单了,只要配置好仓库进行安装即可,并且不用手动创建 services 文件。
# 安装 yum 软件包管理器,有可能还需要安装 device-mapper-persistent-data lvm2,这是 devicemapper 驱动依赖的
yum install -y yum-util
# 配置 yum 源
# 官方源 yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装
yum install containerd -y
运行上述命令,containerd 就安装好了。
如果需要进行配置,直接编辑 /etc/containerd/config.toml 文件即可,因为这个文件已经自动生成好了。
并且 /usr/lib/systemd/system/containerd.service 服务管理文件也自动生成了,只需要启动并配置自启动即可。
systemctl start containerd && systemctl enable containerd
此时就可以使用 ctr image ls 命令查看镜像了。
当使用 runc 作为容器运行时时,默认的 sandbox_image 将是 runc 运行时所依赖的基础镜像。可以编辑 /etc/containerd/config.toml,替换 containerd 默认的 sand_box 镜像。sandbox_image = “registry.aliyuncs.com/google_containers/pause:3.2”
ctr version
ctr image list
# ctr i list
ctr image pull docker.io/library/nginx:latest
# ctr i pull docker.io/library/nginx:latest
这里和 docker 的使用方式不同,docker.io/library/nginx:latest 一定要写全。
ctr images remove docker.io/library/nginx:latest
ctr image tag docker.io/library/nginx:latest docker.io/library/nginx:v1
ctr image export nginx.tar docker.io/library/nginx:latest
ctr image import nginx.tar
导入镜像可能会出现类似于 ctr: content digest sha256:xxxxxx not found 错误,根据网上的解决方案,拉取镜像、导出镜像时,都加上–all-platforms 即可。
ctr containers list
# ctr c list
ctr run -d \
--net-host \
--mount type=bind,src=/home/docker/nginx/logs,dst=/var/log/nginx,options=rbind:rw \
--privileged \
docker.io/library/nginx:latest nginx nginx -g "daemon off;"
可能报错出现如下报错:
ctr: failed to create shim task: OCI runtime create failed: unable to retrieve OCI runtime error (open /run/containerd/io.containerd.runtime.v2.task/default/nginx/log.json: no such file or directory): runc did not terminate successfully: exit status 127: unknown
使用 runc -version 命令排查,是 libseccomp 版本太旧了,containerd 需要 2.4 版本,而本机是 2.3。需要去 https://rpmfind.net/linux/rpm2html/search.php?query=libseccomp 下载高版本的 libseccomp。
# 查询版本
sudo rpm -qa | grep libseccomp
# 卸载
rpm -e libseccomp-2.3.1-4.el7.x86_64 --nodeps
# 安装新版本
rpm -ivh libseccomp-2.5.1-1.el8.x86_64.rpm
再次运行 ctr run命令即可,注意这里不支持 docker 中的 --restart,并且 --rm 和 -d 不能同时使用,绑定需要 --mount 而不能用 -v。
可以看见出现了两次 nginx,第一个 nginx 是容器名,第二个是容器内的命令。
ctr containers remove nginx
这个命令相当于 docker ps。
ctr task ls
ctr task exec -t --exec-id 1 nginx /bin/bash
--exec-id 必须指定,可以是任意一个数字,nginx 为容器 id。
相当于 docker stop。
ctr task pause nginx
# 可使用 ctr task ls 查看状态
ctr task resume nginx
ctr task kill nginx
杀死正在运行的任务,暂停的任务不会杀死。
ctr task kill nginx
ctr task rm nginx
containerd 中还有命名空间的概念。
ctr ns ls
ctr ns create test
ctr ns rm test
提醒:本文发布于397天前,文中所关联的信息可能已发生改变,请知悉!