Containerd 的安装和基本使用


共计 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 关系

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。

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

可执行文件有 containerdctr 等文件,ctrcontainerd 提供的命令行工具,用于与 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

提醒:本文发布于397天前,文中所关联的信息可能已发生改变,请知悉!

Tips:清朝云网络工作室

阅读剩余
THE END