共计 4724 个字符,预计需要花费 12 分钟才能阅读完成。
一、简介
containerd 是容器虚拟化技术,从 docker 中剥离出来,形成开放容器接口(OCI)标准的一部分。
docker 对容器的管理和操作基本都是通过 containerd 完成的。Containerd 是一个工业级标准的容器运行时,它强调简单性、健壮性和可移植性。Containerd 可以在宿主机中管理完整的容器生命周期:容器镜像的传输和存储、容器的执行和管理、存储和网络等。详细点说,Containerd 负责干下面这些事情:
-
管理容器的生命周期(从创建容器到销毁容器)
-
拉取/推送容器镜像
-
存储管理(管理镜像及容器数据的存储)
-
调用 runc 运行容器(与 runc 等容器运行时交互)
-
管理容器网络接口及网络
注意:Containerd 被设计成嵌入到一个更大的系统中,而不是直接由开发人员或终端用户使用。
docker 安装后 containerd 默认已安装,containerd 包含如下命令组件:
-
containerd:高性能容器运行时。
-
ctr:containerd 的命令行客户端。
-
runc:运行容器的命令行工具。
docker、containerd、docker-shim、runC 关系:
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。
1. 离线安装
1.1 下载可执行文件
访问 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
命令会提示报错。
1.2 配置并启动
首先生成 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
命令。
2. 在线安装
2.1 安装
在线安装就比较简单了,只要配置好仓库进行安装即可,并且不用手动创建 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 就安装好了。
2.2 启动
如果需要进行配置,直接编辑 /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"
二、使用
1 查看版本
ctr version
2 镜像相关
2.1 查看镜像
ctr image list
# ctr i list
2.2 下载镜像
ctr image pull docker.io/library/nginx:latest
# ctr i pull docker.io/library/nginx:latest
这里和 docker 的使用方式不同,docker.io/library/nginx:latest
一定要写全。
2.3 删除镜像
ctr images remove docker.io/library/nginx:latest
2.4 修改标签
ctr image tag docker.io/library/nginx:latest docker.io/library/nginx:v1
2.5 导出镜像
ctr image export nginx.tar docker.io/library/nginx:latest
2.6 导入镜像
ctr image import nginx.tar
导入镜像可能会出现类似于 ctr: content digest sha256:xxxxxx not found
错误,根据网上的解决方案,拉取镜像、导出镜像时,都加上--all-platforms 即可。
3 容器相关
3.1 查看容器
ctr containers list
# ctr c list
3.2 创建容器
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 是容器名,第二个是容器内的命令。
3.3 删除容器
ctr containers remove nginx
4 任务相关
4.1 查看运行的任务
这个命令相当于 docker ps
。
ctr task ls
4.2 进入容器
ctr task exec -t --exec-id 1 nginx /bin/bash
--exec-id
必须指定,可以是任意一个数字,nginx 为容器 id。
4.3 暂停任务
相当于 docker stop
。
ctr task pause nginx
# 可使用 ctr task ls 查看状态
4.4 恢复任务
ctr task resume nginx
4.5 杀死任务
ctr task kill nginx
杀死正在运行的任务,暂停的任务不会杀死。
4.5 杀死任务
ctr task kill nginx
4.6 删除任务
ctr task rm nginx
5 命名空间
containerd 中还有命名空间的概念。
5.1 查看命名空间
ctr ns ls
5.3 创建命名空间
ctr ns create test
5.3 删除命名空间
ctr ns rm test
提醒:本文发布于436天前,文中所关联的信息可能已发生改变,请知悉!