Containerd 容器运行时教程
Containerd 是一个行业标准的容器运行时,由 Docker 公司捐赠给 CNCF(云原生计算基金会)。它是 Docker 引擎的核心组件,负责管理容器的完整生命周期——从镜像传输、存储到容器运行和监控。Kubernetes 从 1.24 版本起移除了对 dockershim 的支持,Containerd 成为最主流的容器运行时选择。
一、安装 Containerd
1.1 从 Docker 安装包获取
如果你已经安装了 Docker,Containerd 已经包含在内:
containerd --version
ctr version
1.2 独立安装
# 下载并安装
CONTAINERD_VERSION=1.7.13
curl -Lo containerd.tar.gz https://github.com/containerd/containerd/releases/download/v${CONTAINERD_VERSION}/containerd-${CONTAINERD_VERSION}-linux-amd64.tar.gz
tar xf containerd.tar.gz -C /usr/local/
rm containerd.tar.gz
# 安装 systemd 服务文件
curl -Lo /etc/systemd/system/containerd.service https://raw.githubusercontent.com/containerd/containerd/main/containerd.service
# 生成默认配置
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml
# 启动服务
systemctl daemon-reload
systemctl enable --now containerd
1.3 安装 runc
RUNC_VERSION=1.1.12
curl -Lo /usr/local/sbin/runc https://github.com/opencontainers/runc/releases/download/v${RUNC_VERSION}/runc.amd64
chmod +x /usr/local/sbin/runc
二、使用 ctr 命令
ctr 是 Containerd 的原生命令行工具:
# 拉取镜像
ctr images pull docker.io/library/nginx:latest
# 查看本地镜像
ctr images list
# 运行容器
ctr run -d --net-host docker.io/library/nginx:latest my-nginx
# 查看运行中的容器
ctr containers list
ctr tasks list
# 进入容器
ctr tasks exec --exec-id shell1 -t my-nginx /bin/sh
# 停止容器
ctr tasks kill my-nginx
ctr containers delete my-nginx
三、命名空间管理
Containerd 支持命名空间来隔离不同的容器组:
# 查看所有命名空间
ctr namespaces list
# Docker 使用 moby 命名空间
ctr -n moby containers list
# Kubernetes 使用 k8s.io 命名空间
ctr -n k8s.io containers list
# 创建自定义命名空间
ctr namespaces create my-namespace
ctr -n my-namespace images pull docker.io/library/alpine:latest
四、使用 nerdctl(推荐)
nerdctl 是 Containerd 的 Docker 兼容命令行工具,用法与 Docker CLI 完全一致:
# 安装 nerdctl
NERDCTL_VERSION=1.7.4
curl -Lo nerdctl.tar.gz https://github.com/containerd/nerdctl/releases/download/v${NERDCTL_VERSION}/nerdctl-${NERDCTL_VERSION}-linux-amd64.tar.gz
tar xf nerdctl.tar.gz -C /usr/local/bin/
rm nerdctl.tar.gz
# 使用方法与 Docker 完全一致
nerdctl run -d --name web -p 80:80 nginx:latest
nerdctl ps
nerdctl logs web
nerdctl compose up -d
五、配置 Containerd
cat > /etc/containerd/config.toml <<'EOF'
version = 2
[plugins."io.containerd.grpc.v1.cri"]
sandbox_image = "registry.k8s.io/pause:3.9"
[plugins."io.containerd.grpc.v1.cri".containerd]
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
runtime_type = "io.containerd.runc.v2"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true
[plugins."io.containerd.grpc.v1.cri".registry]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://registry-1.docker.io"]
EOF
systemctl restart containerd
六、为 Kubernetes 配置 Containerd
# 确保 SystemdCgroup 启用
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
# 配置 crictl 使用 containerd
cat > /etc/crictl.yaml <<'EOF'
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
EOF
# 使用 crictl 管理容器
crictl ps
crictl images
七、常见问题
Containerd 无法启动
systemctl status containerd
journalctl -u containerd -f
总结
Containerd 作为底层容器运行时,是 Docker 和 Kubernetes 的核心组件。在搬瓦工 VPS 上使用 nerdctl 可以获得与 Docker 几乎一致的使用体验。如果你计划部署 Kubernetes,Containerd 和 CRI-O 是两个主流的容器运行时选择。选购搬瓦工 VPS 请访问 bwh81.net,购买时使用优惠码 NODESEEK2026 可享受 6.77% 的折扣。