containerd容器引擎服务的安装与使用

1 安装方法列举

以下以在Ubuntu 20.04.3 LTS-amd64 宿主机(arm64宿主机只需要转换对应文件或命令名称即可)上部署containerd 容器引擎服务为例。

  • apt形式安装

    apt install containerd.io

  • 二进制形式安装

    访问 https://github.com/containerd/ 下载对应构架与操作系统的二进制安装文件,解压到自定义目录并进行手动配置

  • 通过源码编译安装

2 apt形式安装

1
2
3
4
5
6
7
8
9
10
11
12
# 安装containerd.io组件
$ apt install containerd.io

# 安装好containerd服务后,/etc/containerd/config.toml文件默认不存在
# 生成配置文件
$ containerd config default > /etc/containerd/config.toml

#修改配置文件后需要重启containerd服务
$ systemctl daemon-reload && systemctl restart containerd

#卸载方法(注意:会将docker服务端同时卸载)
$ apt remove containerd.io

3 二进制方式

1
2
3
4
5
6
7
8
#1.安装containerd本身
#下载 containerd-1.7.24-linux-amd64.tar.gz 二进制压缩文件
root@ubuntu20:/opt/installPkgs# wget https://github.com/containerd/containerd/releases/download/v1.7.24/containerd-1.7.24-linux-amd64.tar.gz
#只查看不解压 归档压缩文件中的内容
root@ubuntu20:/opt/installPkgs# tar -tvf containerd-1.7.24-linux-amd64.tar.gz

#解压到/usr/ 目录下
root@ubuntu20:/opt/installPkgs# tar -zxf containerd-1.7.24-linux-amd64.tar.gz -C /usr/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#封装containerd.service,以使用 systemd对containerd.service 进行管理 
root@ubuntu20:/opt/installPkgs# cat > /lib/systemd/system/containerd.service <<EOF
[Unit]
Description=containerd container runtime
Documentation=https://containerd.io
After=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 overlay
ExecStart=/usr/bin/containerd

Type=notify
Delegate=yes
KillMode=process
Restart=always
RestartSec=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=infinity
LimitCORE=infinity
LimitNOFILE=infinity
# Comment TasksMax if your systemd version
does not supports it.
# Only systemd 226 and above support this
version.
TasksMax=infinity
OOMScoreAdjust=-999

[Install]
WantedBy=multi-user.target
EOF

#重启containerd服务
root@ubuntu20:/opt/installPkgs# systemctl daemon-reload
root@ubuntu20:/opt/installPkgs# systemctl unmask containerd
root@ubuntu20:/opt/installPkgs# systemctl start containerd

root@ubuntu20:/opt/installPkgs# systemctl enable containerd
root@ubuntu20:/opt/installPkgs# systemctl status containerd
1
2
3
4
5
#2.安装runc
#另外,需要手动下载安装runc(后面创建容器时需要用到)
root@ubuntu20:/opt/installPkgs# wget https://github.com/opencontainers/runc/releases/download/v1.1.13/runc.amd64
root@ubuntu20:/opt/installPkgs# chmod a+x runc.amd64
root@ubuntu20:/opt/installPkgs# cp -p runc.amd64 /usr/bin/runc
1
2
3
4
#3.安装cni插件
#从https://github.com/containernetworking/plugins/releases 下载合适版本、操作系统、构架对应的压缩文件
root@ubuntu20:/opt/installPkgs# wget https://github.com/containernetworking/plugins/releases/download/v1.6.0/cni-plugins-linux-amd64-v1.6.0.tgz
root@ubuntu20:/opt/installPkgs# tar -zxf cni-plugins-linux-amd64-v1.6.0.tgz -C /opt/cni/bin/

4 源码编译安装

暂略,后续有需要更新补充到个人博客同步文章。

5 安装与使用containerd服务CLI

​ 一共有3种与containerd服务进行交互的命令行工具:nerdctl、ctr、crictl。

安装与使用nerdctl

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#安装nerdctl
root@ubuntu20:~# cd /opt/installPkgs/
root@ubuntu20:~# wget https://github.com/containerd/nerdctl/releases/download/v2.0.1/nerdctl-2.0.1-linux-amd64.tar.gz

#解压(保证/usr/local/bin 目录在操作系统PATH路径内)
root@ubuntu20:/opt/installPkgs# tar Cxzvvf /usr/local/bin nerdctl-2.0.1-linux-amd64.tar.gz

#安装buildkit(buildkit 是一个将 source code 转换为 build artifacts 的开源工具,buildctl 客户端可用于 Linux、macOS 和 Windows,但 buildkitd 守护进程目前仅适用于 Linux。buildkit暂时没用到,不强制安装,但如果不安装执行nerdctl 相关命令时会告警)
# 下载buildkit-v0.11.5安装包
root@ubuntu20:~# wget https://github.com/moby/buildkit/releases/download/v0.11.5/buildkit-v0.11.5.linux-amd64.tar.gz

# 解压 buildkit-v0.11.5安装包
root@ubuntu20:~# tar -zxvf buildkit-v0.11.5.linux-amd64.tar.gz -C /usr/local

#验证nerdctl 命令、查看containerd版本
root@ubuntu20:~# nerdctl version
image-20250105234139252
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#使用nerdctl管理镜像
root@ubuntu20:~# nerdctl pull registry.cn-hangzhou.aliyuncs.com/quectel/ubuntu:secboot_v2

#查看镜像
root@ubuntu20:~# nerdctl images 或 nerdctl image ls
#查看nerdctl帮助
root@ubuntu20:~# nerdctl --help

#创建容器并进入容器内
root@ubuntu20:~# nerdctl run -it registry.cn-hangzhou.aliyuncs.com/quectel/ubuntu:secboot_v2 /bin/bash
#从容器退出回到宿主机上(尽量使用组合键:ctrl+p+q。在使用Docker容器引擎时,使用exit退出容器会直接将容器停掉,使用nerdctl时虽未发现此情况,但建议还是养成上述好习惯较好)

#配置nerdctl命令自动补全
root@ubuntu20:~# echo "source <(nerdctl completion bash)" >> /root/.bashrc
root@ubuntu20:~# source /root/.bashrc

安装与使用ctr

​ ctr命令行工具是跟随containerd服务一共被安装部署好的,此时可直接使用。

镜像操作

1
2
3
4
5
6
7
8
9
10
11
12
#containerd中新引入命名空间的概念,所有镜像与容器都属于某个特定的命名空间
#也只在特定的命名空间内可见。如果没有指定命名空间,则所有操作在default命名空间内执行
#containerd默认已经创建如下3个命名空间
root@ubuntu20:~# ctr ns ls
NAME LABELS
default
k8s.io
moby
#拉取镜像(如下命名相当于省略了"-n default"
root@ubuntu20:~# ctr image pull registry.cn-hangzhou.aliyuncs.com/quectel/ubuntu:secboot_v2
#查看镜像(如下image可被i替换,list可被ls替换,即"ctr i ls",甚至混合着使用也行)
root@ubuntu20:~# ctr -n default image list
image-20250107224942505
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#镜像标记tag
ctr -n default i tag registry.cn-hangzhou.aliyuncs.com/quectel/ubuntu:secboot_v2 175.6.40.93:8196/base/ubuntu:secboot_v2
#如果新镜像 reference 已存在, 则需要先删除新reference, 或者加上"--force"强制替换
ctr -n default i tag --force registry.cn-hangzhou.aliyuncs.com/quectel/ubuntu:secboot_v2 175.6.40.93:8196/base/ubuntu:secboot_v2

#推送镜像
ctr -n default i push -k 175.6.40.93:8196/base/ubuntu:secboot_v2
#拉取镜像
ctr -n default i pull -k 175.6.40.93:8196/base/ubuntu:secboot_v2

#删除镜像
ctr -n default i rm 175.6.40.93:8196/base/ubuntu:secboot_v2

#导出镜像
ctr -n default i export ubuntu-secboot_v2.tar 175.6.40.93:8196/base/ubuntu:secboot_v2
#导入镜像
ctr -n default i import ubuntu-secboot_v2.tar

容器操作

1
2
3
4
5
#创建容器(会自动进入容器内。此方式创建的默认是静态的容器,静态容器与动态容器是ctr中的概念)
root@ubuntu20:~# ctr run -t registry.cn-hangzhou.aliyuncs.com/quectel/ubuntu:secboot_v2 test01
#退出容器使用exit命令或组合键“ctrl+d”
#查看容器
root@ubuntu20:~# ctr c ls
image-20250105234351116
1
2
3
4
5
6
7
8
9
#查看容器详细信息
ctr container info test01

#静态容器启动为动态容器
复制containerd连接runC垫片工具至系统即保证/usr/bin/目录有一个containerd-shim-runc-v2执行文件
#启动task,即表示在容器中运行了进程,即为动态容器(-d表示daemon或者后台的意思)
ctr task start -d test01
#查看task也是查看容器所在宿主机进程(它其实是一个宿主机进程,即165225上一个宿主机进程id
ctr task ls
image-20250105234414968
1
2
#查看容器的进程(都是宿主机的进程)
ctr task ps test01
image-20250105234439449
1
2
#宿主机查看到相应的进程
ps -ef | grep 165225
image-20250105234512202
1
2
3
4
5
6
#查看正在运行中的容器
ctr task ls

#重新进入动态容器内
root@ubuntu20:~# ctr -n default task exec --exec-id $RANDOM -t test01 bash
#退出动态容器,使用exit或组合键"ctrl+d"。此后此动态容器仍然是处于Running状态
image-20250105234549550
1
2
3
4
#直接创建一个动态的容器然后进入容器内,其中--net-host 代表容器的IP就是宿主机的IP(相当于docker里的host类型网络),
ctr run -d --net-host registry.cn-hangzhou.aliyuncs.com/quectel/ubuntu:secboot_v2 test02
ctr task ls
ctr -n default task exec --exec-id $RANDOM -t test02 bash
image-20250105234638744
1
2
3
4
5
6
7
#删除容器
#首先要将动态容器对应的task杀死、删除
root@ubuntu20:~# ctr task kill test01
root@ubuntu20:~# ctr task delete test01
#此时test01容器是处于Created状态(如果安装了nerdctl,可以使用“nerdctl ps -a”查看)
#此时才能删除test01容器
root@ubuntu20:~# ctr c delete test01

笔者认为ctr命令行工具的执行习惯不像nerdctl、crictl,平时用起来不太方便。但如果是用来调试,还是可以的

安装与使用crictl

​ crictl与Kubernetes的紧密集成,它无法直接查看或调试非Kubernetes创建的容器。所以无法在非kubernetes环境直接操作容器。

1
2
3
4
5
6
7
#下载安装
# 此处使用v1.30.0版本,所有及最新版本可在此查看:https://github.com/kubernetes-sigs/cri-tools/releases
cd /opt/installPkgs
VERSION="v1.30.0"
wget https://github.com/kubernetes-sigs/cri-tools/releases/download/$VERSION/crictl-$VERSION-linux-amd64.tar.gz
#解压
tar zxvf crictl-$VERSION-linux-amd64.tar.gz -C /usr/local/bin
image-20250105234828836
1
2
3
4
5
6
7
8
#该 WARN 消息(图未截全)表明,crictl 或其他相关工具在尝试连接容器运行时(如 containerd)时,正在使用默认的设置中的端点列表。但默认的设置已经被弃用,而又未明确设置crictl的runtime-endpoint。解决上述警告的方法
#配置容器运行时和镜像服务的端点
cat > /etc/crictl.yaml <<EOF
runtime-endpoint: unix:///run/containerd/containerd.sock
#image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF
1
2
3
4
#拉取镜像
root@ubuntu20:~# crictl pull registry.cn-hangzhou.aliyuncs.com/quectel/ubuntu:secboot

#其他用法参考下图
image-20250109211000203

6 参考资源

  • 关于buildkit的介绍可参考:https://github.com/moby/buildkit
  • containerd入门:https://github.com/containerd/containerd/blob/main/docs/getting-started.md
  • ctr用法:直接执行“ctr --help”、https://github.com/projectatomic/containerd/blob/master/docs/cli.md、https://www.akiraka.net/kubernetes/1139.html、https://www.cnblogs.com/lldhsds/p/18262839

containerd容器引擎服务的安装与使用
https://jiangsanyin.github.io/2025/01/05/containerd容器引擎服务的安装与使用/
作者
sanyinjiang
发布于
2025年1月5日
许可协议