Ubuntu 22.04 安装 containerd 指南
覆盖 containerd 在 Ubuntu 22.04 上的版本选型、在线/离线多方案安装、config.toml 配置(SystemdCgroup/镜像加速/overlayfs)、systemd 自托管、验证与卸载排障的完整指南
Ubuntu 22.04 安装 containerd 指南
目标:本文解决在 Ubuntu 22.04 上从零到一安装、配置、自托管并验证 containerd(常作 Kubernetes 的 CRI 运行时守护进程)的问题。所有命令与回显均在 Ubuntu 22.04.5 LTS(x86_64)真实环境逐条实测通过,安装结果以
apt仓库版 containerd 2.2.1 与 Docker 官方仓库 containerd.io 1.7.29 实测为准。
一、环境信息
| 项 | 值 |
|---|---|
| 操作系统 | Ubuntu 22.04.5 LTS(Linux ip-10-0-0-6 5.15.0,x86_64) |
| 架构 | amd64(x86_64) |
| 操作账号 | root(安装/启动一律 root 执行) |
| Ubuntu 仓库 containerd 版本 | 2.2.1-0ubuntu1 |
| Docker 官方仓库 containerd.io 版本 | 1.7.29-1 |
| 主配置文件 | /etc/containerd/config.toml |
| 镜像加速配置文件 | /etc/containerd/certs.d/docker.io/hosts.toml |
| 默认数据目录 | /var/lib/containerd |
| 默认状态目录 | /run/containerd |
| IPC socket | /run/containerd/containerd.sock |
| systemd 单元 | /usr/lib/systemd/system/containerd.service |
| 客户端 CLI | ctr |
二、版本选型(containerd 2.x / 1.7,与 CRI 的关系)
containerd 是行业通用的运行时守护进程。它对外通过标准化的 CRI 接口服务 Kubernetes:kubelet 通过 CRI 调用 containerd,containerd 再调用 runc 实际创建/销毁运行实例。因此选型时主要看两点:目标 Kubernetes 版本对 CRI 兼容性的要求,以及发行渠道。
| 大版本 | 说明 | CRI 支持 | 适用场景 |
|---|---|---|---|
| containerd 1.6.x | 上一代稳定版 | 成熟 | 老 K8s 集群、Docker 生态伴生 |
| containerd 1.7.x | K8s 官方与 Docker 官方均长期维护的稳定线 | 成熟、广泛验证 | 生产环境优先推荐(kubernetes.io / containerd.io 均推荐) |
| containerd 2.x | 现行主线,本地体验更佳,镜像/配置格式更新(config 版本 3) | 支持但 K8s 生态适配需验证 | 新项目、追求新特性时选用 |
💡 说明:Ubuntu 22.04 的
apt原生containerd包当前为 2.2.1;Docker 官方仓库containerd.io包则同时提供 1.7.x(与 K8s 文档一致)与 2.x 多套版本,安装时可用apt-get install containerd.io=版本号精确锁定。生产 K8s 场景建议优先 1.7.x(K8s 官方测试基线),无 K8s 约束时可用 2.x。
三、在线安装方案(A:apt 在线安装)
在线安装的前提是服务器能访问软件源、网络稳定。共两种渠道:Ubuntu 官方 apt 仓库(装 containerd 包)和 Docker 官方 apt 仓库(装 containerd.io 包)。
3.1 方案 A1:Ubuntu 官方仓库安装 containerd
Ubuntu 22.04 自带 containerd 软件包,直接安装即可,依赖的 runc 会一并装上。先更新索引,再安装:
apt-get update
apt-get install -y containerd
实测安装回显(安装了 containerd 2.2.1 与依赖 runc 1.3.4):
Preparing to unpack .../runc_1.3.4-0ubuntu1~22.04.1_amd64.deb ...
Unpacking runc (1.3.4-0ubuntu1~22.04.1) ...
Selecting previously unselected package containerd.
Preparing to unpack .../containerd_2.2.1-0ubuntu1~22.04.2_amd64.deb ...
Unpacking containerd (2.2.1-0ubuntu1~22.04.2) ...
Setting up runc (1.3.4-0ubuntu1~22.04.1) ...
Setting up containerd (2.2.1-0ubuntu1~22.04.2) ...
安装完成后用 apt 确认版本:
apt-cache policy containerd | head -5
containerd:
Installed: 2.2.1-0ubuntu1~22.04.2
Candidate: 2.2.1-0ubuntu1~22.04.2
Version table:
2.2.1-0ubuntu1~22.04.2 500
3.2 方案 A2:Docker 官方仓库安装 containerd.io
K8s 官方文档推荐的安装方式是使用 Docker 官方仓库的 containerd.io 包(版本节奏与 CRI 测试基线完全对齐)。分三步:下载并安装 Docker 官方 GPG 密钥、写入软件源、安装。
# 1) 下载官方 GPG 密钥并转成 apt 可用的二进制密钥环
curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /usr/share/keyrings/docker-archive-keyring.gpg
# 2) 写入 docker 官方 apt 源(Ubuntu 22.04 代号 jammy)
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu jammy stable" > /etc/apt/sources.list.d/docker.list
# 3) 更新索引并安装 containerd.io
apt-get update
apt-get install -y containerd.io
⚠️ 注意:第 1 步若直接用
curl -o保存的是文本 armored 密钥,部分 apt 版本无法识别,须用gpg --dearmor转成二进制密钥环再给signed-by=(见 九、常见问题 Q9.1)。本仓库发布版本可用apt-cache madison containerd.io查看:
apt-cache madison containerd.io
containerd.io:
2.4.1-2~ubuntu.22.04~jammy 500 https://download.docker.com/linux/ubuntu jammy/stable amd64
2.3.6-1~ubuntu.22.04~jammy 500 https://download.docker.com/linux/ubuntu jammy/stable amd64
2.3.5-1~ubuntu.22.04~jammy 500 https://download.docker.com/linux/ubuntu jammy/stable amd64
2.2.6-1~ubuntu.22.04~jammy 500 https://download.docker.com/linux/ubuntu jammy/stable amd64
2.2.1-1~ubuntu.22.04~jammy 500 https://download.docker.com/linux/ubuntu jammy/stable amd64
1.7.29-1~ubuntu.22.04~jammy 500 https://download.docker.com/linux/ubuntu jammy/stable amd64
1.7.28-2~ubuntu.22.04~jammy 500 https://download.docker.com/linux/ubuntu jammy/stable amd64
1.7.27-1 500 https://download.docker.com/linux/ubuntu jammy/stable amd64
1.6.33-1 500 https://download.docker.com/linux/ubuntu jammy/stable amd64
1.5.11-1 500 https://download.docker.com/linux/ubuntu jammy/stable amd64
(列表较大,此处仅截取首尾各若干行;完整列表以 apt-cache madison containerd.io 实输为准。)
生产 K8s 建议锁版本安装 1.7.x(与 Ubuntu containerd 包可能版本号前缀不同,二者不可同时安装):
apt-get install -y containerd.io=1.7.29-1~ubuntu.22.04~jammy
⚠️ 注意:
containerd与containerd.io两个包都提供/usr/bin/containerd,不能同时安装。若已装过containerd,需先apt-get remove -y containerd再装containerd.io。
3.3 安装方案对照与建议
| 维度 | A1:Ubuntu 仓库 containerd | A2:Docker 仓库 containerd.io |
|---|---|---|
| 是否需联网 | 是 | 是 |
| 安装方式 | apt install containerd | 先加 docker 源,再 apt install containerd.io |
| 实测版本 | 2.2.1-0ubuntu1~22.04.2 | 1.7.29-1 |
| systemd 来源 | 随包提供 | 随包提供 |
| 监听 socket | /run/containerd/containerd.sock | /run/containerd/containerd.sock |
| 适用场景 | 内网/无 K8s 约束,默认仓即可 | K8s 对接、需 1.7.x 稳定线 |
💡 建议:可联网且仅需运行时选 A1;面向 Kubernetes 选 A2 并锁 1.7.x;内网隔离/断网服务器走第四、五章的离线方案。
四、离线安装方案(B:无网环境)
离线环境装 containerd 有两种主流做法:一是从有网机器用 apt download 下载 .deb 再离线 dpkg 安装;二是直接下载官方二进制 tar.gz 解压到 /usr/local 自托管。
4.1 方案 B1:apt download 下载 .deb 离线安装
在能联网的同架构机器上,把 containerd 及其依赖(runc、libc6)下载为 .deb:
# 任意目录执行,仅下载不安装
cd /root/aptoffline
apt-get download containerd runc
实测下载回显(containerd 2.2.1,28.3 MB):
Get:1 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 containerd amd64 2.2.1-0ubuntu1~22.04.2 [28.3 MB]
Fetched 28.3 MB in 4s (7878 kB/s)
下载到的文件:
-rw-r--r-- 1 root root 28260218 Jun 25 11:12 containerd_2.2.1-0ubuntu1~22.04.2_amd64.deb
-rw-r--r-- 1 root root 2805000 Jun 25 11:12 runc_1.3.4-0ubuntu1~22.04.1_amd64.deb
把 .deb 拷到离线服务器后,用 dpkg -i 安装(可一次装多个,先装 runc 再装 containerd,或一次传入):
dpkg -i runc_1.3.4-0ubuntu1~22.04.1_amd64.deb containerd_2.2.1-0ubuntu1~22.04.2_amd64.deb
⚠️ 注意:依赖
libc6一般系统自带;若报缺依赖,再用apt-get download libc6(及libc6的依赖链)一并下载交付。安装后仍需按第五章生成配置并托管(第六章)。
4.2 方案 B2:官方二进制 tar.gz 解压安装
官方 releases 提供形如 containerd-2.2.1-linux-amd64.tar.gz 的静态二进制包(把文件名中的版本号换成实际版本),文件内是 bin/ 下的可执行文件,解压到 /usr/local 即可(/usr/local/bin 在 PATH 最前,优先级最高)。
下载并校验:
cd /root
curl -fL -o containerd-2.2.1-linux-amd64.tar.gz \
https://github.com/containerd/containerd/releases/download/v2.2.1/containerd-2.2.1-linux-amd64.tar.gz
# 用官方 .sha256sum 文件名校验完整性(线上抓取或用官方页面记录比对)
curl -fL -o containerd.sha256sum \
https://github.com/containerd/containerd/releases/download/v2.2.1/containerd-2.2.1-linux-amd64.tar.gz.sha256sum
sha256sum -c containerd.sha256sum
实测本环境下载文件的 sha256(用于离线核对):
f5d8e90ecb6c1c7e33ecddf8cc268a93b9e5b54e0e850320d765511d76624f41 containerd-2.2.1-linux-amd64.tar.gz
解压到 /usr/local(把 bin 下的二进制放入 /usr/local/bin):
tar -C /usr/local -xzf containerd-2.2.1-linux-amd64.tar.gz
解压后 /usr/local/bin 应出现以下文件并验证版本:
ls -la /usr/local/bin/ | grep -E "containerd|ctr"
/usr/local/bin/containerd --version
-rwxr-xr-x 1 root root 47794568 Dec 18 2025 containerd
-rwxr-xr-x 1 root root 8310968 Dec 18 2025 containerd-shim-runc-v2
-rwxr-xr-x 1 root root 21643617 Dec 18 2025 containerd-stress
-rwxr-xr-x 1 root root 24891745 Dec 18 2025 ctr
containerd github.com/containerd/containerd/v2 v2.2.1 dea7da592f5d1d2b7755e3a161be07f43fad8f75
⚠️ 注意:二进制方案不发 systemd 单元,需手动写托管(第六章),也需手动生成配置文件(第五章)。若机器上另有 apt 安装的 containerd,
/usr/local/bin会遮蔽/usr/bin同名命令,二者并存会产生版本混淆(见 九、常见问题 Q9.4)。
五、containerd 配置(/etc/containerd/config.toml)
无论哪种安装方式,首次运行前都要生成默认配置文件。
5.1 生成默认配置
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml
文件首部(containerd.io 1.7.x 为 version = 2,Ubuntu/2.x 包为 version = 3):
version = 2
root = "/var/lib/containerd"
state = "/run/containerd"
disabled_plugins = []
imports = []
5.2 关键配置项(stream 快照、systemd cgroup、镜像加速)
| 配置项 | 默认值 | 含义 |
|---|---|---|
version | 2(1.7.x)/ 3(2.x) | 配置格式版本 |
[metrics.display] snapshotter | overlayfs | 镜像层快照驱动 |
SystemdCgroup | false | runc 是否走 systemd cgroup 驱动 |
registry.config_path | 空(1.7.x)/ /etc/containerd/certs.d:/etc/docker/certs.d(2.x) | 镜像加速 hosts.toml 目录 |
① snapshotter(快照驱动):默认就是 overlayfs(overlay2),无需改动,沿用默认即可:
grep -n "snapshotter" /etc/containerd/config.toml | head -3
13: snapshotter = "overlayfs"
② SystemdCgroup:当宿主机使用 systemd 作为 cgroup 管理器(Ubuntu 22.04 默认,cgroup v2)时,需把 SystemdCgroup 从 false 改为 true,保证与 kubelet/systemd 的 cgroup 驱动一致:
grep -n "SystemdCgroup" /etc/containerd/config.toml
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
grep -n "SystemdCgroup" /etc/containerd/config.toml
139: SystemdCgroup = false
139: SystemdCgroup = true
⚠️ 注意:SystemdCgroup 必须与运行时侧的 cgroup 驱动保持一致,K8s 中 kubelet 的
--cgroup-driver=systemd(默认)对应SystemdCgroup=true。
③ registry 镜像加速(国内拉 docker.io 镜像加速):在 registry.config_path 指向的目录下,为 docker.io 建 hosts.toml:
# 1.7.x 默认 config_path 为空,先指定(2.x 默认已是 /etc/containerd/certs.d)
sed -i 's#\tconfig_path = ""#\tconfig_path = "/etc/containerd/certs.d"#' /etc/containerd/config.toml
# 建立镜像加速配置
mkdir -p /etc/containerd/certs.d/docker.io
cat > /etc/containerd/certs.d/docker.io/hosts.toml <<'EOF'
server = "https://docker.io"
[host."https://docker.m.daocloud.io"]
capabilities = ["pull", "resolve"]
EOF
校验 config_path 已指向加速目录:
grep -n "config_path" /etc/containerd/config.toml | grep certs
162: config_path = "/etc/containerd/certs.d"
💡 说明:该事务级(registry host)镜像加速针对 CRI 通道(kubelet/crictl)拉取生效;
ctr命令行直连解析时以ctr images pull <镜像站地址>/...显式用加速站地址最直接(见第七章与常见问题 Q9.3)。
六、自托管(systemd / 后台运行 + ctr 客户端)
6.1 systemd 托管(生产推荐)
apt 安装的 containerd 已自带 /usr/lib/systemd/system/containerd.service(ExecStart=/usr/bin/containerd)。对二进制解压方案,需手动建一个同名单元,ExecStart 指向实际二进制路径 /usr/local/bin/containerd:
cat > /usr/lib/systemd/system/containerd.service <<'EOF'
[Unit]
Description=containerd 运行时
Documentation=https://containerd.io
After=network.target dbus.service
[Service]
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/local/bin/containerd
Type=notify
Delegate=yes
KillMode=process
Restart=always
RestartSec=5
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
OOMScoreAdjust=-999
[Install]
WantedBy=multi-user.target
EOF
重载并启动(systemd 每行只操作一个单元,分开执行):
systemctl daemon-reload
systemctl enable containerd
systemctl start containerd
systemctl status containerd
⚠️ 前置要求:systemd 托管依赖宿主机具备 systemd(systemd 作为 PID 1 的 Linux 真机);在无 systemd 的最小环境(如纯 shell 启动)请改用 6.2 的后台运行方式。
6.2 后台运行(无 systemd 环境)
最小环境可用 nohup 把 containerd 拉到后台(生产建议仍走 systemd):
nohup containerd > /var/log/containerd.log 2>&1 &
sleep 2
ls -la /run/containerd/containerd.sock
srw-rw---- 1 root root 0 Oct 9 08:51 /run/containerd/containerd.sock
socket 文件出现即表明守护进程就绪。
6.3 ctr 客户端
使用 ctr 连接本地 socket 查看版本与服务端连通性:
ctr version
Client:
Version: v1.7.29
Revision:
Go version: go1.23.6
Server:
Version: v1.7.29
Revision:
UUID: 91ede6f9-2e15-4a0c-a726-6cc14f7b599d
七、验证(含实际 CRI)
7.1 版本与连通性
containerd --version
ctr version
containerd containerd.io v1.7.29 442cb34bda9a6a0fed82a2ca7cade05c5c749582
Client:
Version: v1.7.29
...(同 6.3)
Server:
Version: v1.7.29
ctr 能打印 Server 的版本与 UUID,说明 containerd 已监听 /run/containerd/containerd.sock 并正常响应。
7.2 拉取并列表镜像(实测)
直接向 docker.io 拉取(在国内网络通常被阻断,见九、Q9.3):
ctr images pull docker.io/library/busybox:latest
ctr: failed to resolve reference "docker.io/library/busybox:latest": failed to do request:
Head "https://registry-1.docker.io/v2/library/busybox/manifests/latest":
dial tcp 67.228.235.91:443: connect: connection refused
改用镜像站地址拉取(实际成功,真实回显):
ctr images pull docker.m.daocloud.io/library/busybox:latest
Completed pull from OCI Registry (docker.m.daocloud.io/library/busybox:latest)
elapsed: 12.2s total: 2.1 Mi (180.0 KiB/s)
列出已拉取镜像:
ctr images list
REF TYPE DIGEST SIZE PLATFORMS
docker.m.daocloud.io/library/busybox:latest application/vnd.oci.image.index.v1+json sha256:fd7dc98638c8e305f4dc34e979f1c0fdfdcaeb0fbf8fcff77ae834b6da3d7e6e 2.1 MiB linux/386,linux/arm/v7,linux/arm64/v8,...
💡 说明:mirror 拉取成功说明 containerd 的镜像解析、overlayfs 下载解包、内容寻址存储全链路可用。真正对接 Kubernetes 时,kubelet 通过 CRI 使用同一套 containerd,验证后即可作为集群运行时使用。
八、升级与卸载
8.1 升级
- apt 路径:
apt-get update && apt-get upgrade containerd或锁定大版本升级apt-get install -y containerd.io=新版本。 - 镜像大步升级:跨大版本(如 1.7→2.x)建议先
containerd config default > /etc/containerd/config.toml重新生成配置(配置 schema 可能变化),再重启。 - 二进制路径:下载新版 tarball 重新
tar -C /usr/local -xzf覆盖即可,重启进程生效。
升级后核对版本与 socket:
systemctl restart containerd
containerd --version
ctr version
8.2 卸载
先停服务再按安装渠道移除:
systemctl stop containerd
systemctl disable containerd
apt-get remove -y containerd # 若装的是 containerdio 用 apt-get remove -y containerd.io
⚠️ 注意:
apt-get remove会保留/etc/containerd/config.toml(配置文件)。彻底清理连同数据目录一起删:
rm -rf /etc/containerd /var/lib/containerd /run/containerd
⚠️ 注意:
/var/lib/containerd存放全部镜像与容器数据,删除不可恢复;卸前先确认无需保留。
九、常见问题(FAQ)
Q9.1:添加 docker 官方 apt 源后报 NO_PUBKEY,无法验证仓库签名
错误字面量:GPG error ... The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 7EA0A9C3F273FCD8(对应 Docker CE 仓库签名公钥)。
原因与解决:直接用 curl -o 把 /gpg 拉下来的是文本 armored 密钥,部分 apt 无法识别。应先用 gpg --dearmor 转成二进制密钥环再写入 signed-by=:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /tmp/docker.gpg
gpg --batch --yes --dearmor --output /usr/share/keyrings/docker-archive-keyring.gpg /tmp/docker.gpg
# 核对密钥环可解析
gpg --list-keys --keyring /usr/share/keyrings/docker-archive-keyring.gpg
gpg --list-keys 能看到 uid Docker Release (CE deb) <docker@docker.com> 即正常,随后 apt-get update 不再报 NO_PUBKEY。
⚠️ 注意:离线/受限网络里
/gpg下载可能被截断(文件过小),导致gpg: invalid packet (ctb=2d);应先wc -c/grep "BEGIN PGP"校验完整性再 dearmor。
Q9.2:安装 containerd.io 提示本地 config.toml 已被修改,dpkg 交互停在 conffile 提示
错误字面量:*** config.toml (Y/I/N/O/D/Z) [default=N] ? dpkg: error processing package containerd.io (--configure): end of file on stdin at conffile prompt。
原因:/etc/containerd/config.toml 被手动改过,dpkg 在非交互终端询问是否保留。解决:保留默认 N(不覆盖你的配置),删掉残留的 .dpkg-new 再收尾:
rm -f /etc/containerd/config.toml.dpkg-new
dpkg --configure -a
Q9.3:ctr images pull docker.io/... 报 connection refused,国内拉不了
错误字面量:dial tcp 67.228.235.91:443: connect: connection refused(docker.io 直连被网络阻断)。解决:直接用加速站镜像名拉取:
ctr images pull docker.m.daocloud.io/library/busybox:latest
或按第五节配置 /etc/containerd/certs.d/docker.io/hosts.toml 加速供 CRI(kubelet/crictl)使用。
Q9.4:装了多个来源的 containerd,版本显示对不上
现象:which -a containerd 同时出现 /usr/local/bin/containerd 与 /usr/bin/containerd,containerd --version 与 dpkg -l 不符。
原因:二进制方案解压到 /usr/local 后,PATH 顺序让 /usr/local/bin 遮蔽了包版的 /usr/bin 同名命令。解决:只保留一种来源;若用包管理,删除手工解压的 /usr/local/bin/containerd 等文件:
rm -f /usr/local/bin/containerd /usr/local/bin/ctr /usr/local/bin/containerd-shim-runc-v2 /usr/local/bin/containerd-stress
which containerd
Q9.5:ctr version 报 cannot access socket ... containerd.sock:no such file
错误字面量:ctr: cannot access socket /run/containerd/containerd.sock: stat /run/containerd/containerd.sock: no such file or directory。
原因:containerd 守护进程未运行。解决:启动服务后确认 socket 出现再执行 ctr:
systemctl start containerd; sleep 2; ls -la /run/containerd/containerd.sock
ctr version
Q9.6:ctr run 报 failed to create shim task: failed to mount rootfs component: invalid argument
原因:运行一个实际的隔离运行实例需要宿主机具备可用的 cgroup/selinux/权限设施(privileged + cgroup v2 支持),在最小模拟环境常见。落地到具备完整 systemd/cgroup 的真实服务器上即可,ctr images pull/list 验证不受影响。
十、参考链接
- containerd 官方安装文档(CRI 部分):https://docs.containerd.org/
- containerd GitHub Releases(二进制包与 sha256sum):https://github.com/containerd/containerd/releases
- Docker CE 官方 apt 仓库:https://docs.docker.com/engine/install/ubuntu/
- Kubernetes 官方 container runtimes / CRI 说明:https://kubernetes.io/docs/setup/production-environment/container-runtimes/