Containerd 容器管理工具核心总结与实验指南

一、Containerd 概述与核心重点

1.1 什么是 Containerd?

Containerd 是一个工业级的容器运行时管理器,最初从 Docker Engine 中剥离出来,成为独立的开源项目。它的设计目标是为 Kubernetes 等容器编排系统提供稳定、高效的容器生命周期管理能力。

核心特点:

  • 采用 C/S 架构,通过 gRPC API 提供服务
  • 每个 Containerd 实例管理单台机器上的容器、镜像、存储和网络
  • 底层依赖 runC(符合 OCI 规范)来实际运行容器
  • 不直接面向最终用户,而是集成到上层编排系统(K8s、Swarm、Mesos)

1.2 Containerd 的演进历程

时间 事件
2013 Docker 公司推出 Docker
2016 Docker 1.11 中开始包含 Containerd
2017 Docker 公司将 Containerd 捐给 CNCF
2020 Kubernetes 1.20 宣布逐步弃用 Docker 直接支持,推荐使用 Containerd

关键背景: 为了遏制 Docker 在容器市场的垄断,Google 联合 RedHat、IBM 创建 CNCF,并开源 Kubernetes。Docker 的 Swarm 在编排领域失败后,将核心依赖 Containerd 捐给 CNCF,最终 Kubernetes 标准化的 CRI(容器运行时接口)使 Containerd 成为主流的容器运行时。

1.3 Containerd 架构重点

┌─────────────────────────────────────────────────────────┐
│                    上层系统 (K8s/Swarm)                  │
└─────────────────────────────────────────────────────────┘
                              │ gRPC API
┌─────────────────────────────────────────────────────────┐
│                    Containerd Daemon                     │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐  │
│  │  Storage     │  │  Metadata    │  │  Runtime     │  │
│  │  - Content   │  │  - Containers│  │  - Tasks     │  │
│  │  - Snapshot  │  │  - Images    │  │  - Shim      │  │
│  └──────────────┘  └──────────────┘  └──────────────┘  │
└─────────────────────────────────────────────────────────┘
                              │
                    ┌─────────────────┐
                    │      runC       │
                    │ (OCI 合规容器)   │
                    └─────────────────┘

核心组件(插件):

  • Content Plugin:管理镜像内容寻址存储
  • Snapshot Plugin:管理容器文件系统快照(类似 Docker 的 graphdriver)
  • Metrics:暴露监控指标

1.4 性能对比结论

使用 bucketbench 测试表明:Containerd 在容器启动、停止、删除等操作的综合性能优于 Docker 和 CRI-O


二、安装实验(CentOS Stream 8)

2.1 YUM 方式安装(推荐快速体验)

# 1. 添加阿里云 Docker CE YUM 源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 2. 更新 YUM 缓存
yum makecache

# 3. 查看可用的 containerd 包
yum list | grep containerd
# 输出示例: containerd.io.x86_64    1.6.32-3.1.el8    docker-ce-stable

# 4. 安装 containerd.io(会自动安装 containerd)
yum -y install containerd.io

# 5. 验证安装
rpm -qa | grep containerd
# 输出: containerd.io-1.6.32-3.1.el8.x86_64

# 6. 启动并设置开机自启
systemctl enable containerd --now
systemctl status containerd

# 7. 验证客户端和服务端版本
ctr version
# 输出示例:
# client:
#   version: 1.6.32
# server:
#   version: 1.6.32
#   UUID: xxxxx

2.2 二进制方式安装(生产环境推荐)

二进制包提供更灵活的配置,适合 Kubernetes 集群部署。

# 1. 下载 cri-containerd-cni 包(包含 runC 和 CNI 插件)
wget https://github.com/containerd/containerd/releases/download/v1.6.32/cri-containerd-cni-1.6.32-linux-amd64.tar.gz

# 2. 解压到指定目录
mkdir /root/containerd
tar xf cri-containerd-cni-1.6.32-linux-amd64.tar.gz -C /root/containerd/

# 3. 查看解压后的目录结构
cd /root/containerd
tree
# 主要目录:
#   etc/          -> 服务配置文件、CNI 配置
#   usr/local/bin -> containerd、ctr、runc 等二进制文件
#   opt/          -> CNI 网络插件

# 4. 复制二进制文件到系统 PATH
cp usr/local/bin/* /usr/local/bin/

# 5. 复制 systemd 服务文件
cp etc/systemd/system/containerd.service /usr/lib/systemd/system/

# 6. 创建 containerd 配置目录并生成默认配置文件
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml

# 7. 启动 containerd
systemctl enable containerd --now
systemctl status containerd

# 8. 验证
ctr version

2.3 单独安装 runC(可选,解决 seccomp 依赖)

# 下载最新 runC 二进制
wget https://github.com/opencontainers/runc/releases/download/v1.3.0/runc.amd64

# 安装并添加可执行权限
mv runc.amd64 /usr/sbin/runc
chmod +x /usr/sbin/runc

# 验证
runc -v
# 输出: runc version 1.3.0

三、镜像管理实验(ctr 命令)

ctr 是 Containerd 原生的 CLI 工具,主要用于调试和管理。

3.1 常用帮助命令

# 查看总帮助
ctr --help

# 查看镜像子命令帮助
ctr images --help

3.2 镜像操作实战

# ---------- 1. 拉取镜像 ----------
# 注意:ctr pull 需要完整路径(可使用镜像加速地址)
ctr images pull docker.io/library/nginx:latest
# 或使用国内镜像加速(示例)
ctr images pull 054b8ac70e8010d90f2ac00ef29e6580.mirror.swr.myhuaweicloud.com/library/nginx:latest

# ---------- 2. 查看镜像列表 ----------
ctr images ls
# 简写形式
ctr i ls
# 输出: REF TYPE DIGEST SIZE PLATFORMS LABELS

# ---------- 3. 镜像挂载(查看镜像内容)----------
# 将镜像挂载到 /mnt 目录,方便查看内部文件
ctr images mount nginx:latest /mnt
# 查看挂载点内容
ls /mnt
# 卸载
umount /mnt

# ---------- 4. 导出镜像为 tar 文件 ----------
# 指定平台导出(如 linux/amd64)
ctr images export --platform linux/amd64 nginx.tar nginx:latest
ls -lh nginx.tar

# ---------- 5. 删除镜像 ----------
ctr images rm nginx:latest
# 验证删除
ctr images ls

# ---------- 6. 导入镜像 ----------
ctr images import --platform linux/amd64 nginx.tar
# 导入后镜像名会保留原始完整路径,需要打标签简化

# ---------- 7. 给镜像打标签 ----------
# 格式: ctr images tag <源镜像> <新标签>
ctr images tag 054b8ac70e8010d90f2ac00ef29e6580.mirror.swr.myhuaweicloud.com/library/nginx:latest nginx:latest

# ---------- 8. 推送镜像到私有仓库(Harbor)----------
# 先打标签
ctr images tag nginx:latest my.harbor.com/cloud/nginx:latest
# 推送(HTTP 仓库需加 --plain-http,需要认证加 --user)
ctr images push --platform linux/amd64 --plain-http --user "admin:password" my.harbor.com/cloud/nginx:latest

四、容器生命周期管理实验

Containerd 区分 静态容器(Container)动态任务(Task)

  • Container:资源配置和元数据,不运行进程
  • Task:实际运行的进程(容器内的 PID)

4.1 分步创建与运行容器

# ---------- 1. 创建静态容器(不运行)----------
ctr container create nginx:latest nginx1
# 查看静态容器
ctr container ls
# 或简写: ctr c ls

# ---------- 2. 查看容器详细信息 ----------
ctr container info nginx1

# ---------- 3. 启动容器(创建 Task)----------
# -d 后台运行
ctr task start -d nginx1
# 查看运行中的任务
ctr task ls
# 输出: TASK     PID     STATUS
#       nginx1   22614   RUNNING

# ---------- 4. 进入容器执行命令 ----------
# --exec-id 需要唯一标识(可用 $RANDOM)
ctr task exec --exec-id $RANDOM -t nginx1 /bin/sh
# 进入容器后可以执行 ls、ps 等命令,exit 退出

# ---------- 5. 暂停容器 ----------
ctr task pause nginx1
ctr task ls   # STATUS 变为 PAUSED

# ---------- 6. 恢复容器 ----------
ctr task resume nginx1
ctr task ls   # STATUS 恢复 RUNNING

# ---------- 7. 停止容器(发送信号)----------
ctr task kill nginx1
ctr task ls   # STATUS 变为 STOPPED

# ---------- 8. 删除 Task ----------
ctr task delete nginx1
# 此时静态容器仍然存在
ctr container ls   # 还能看到 nginx1

# ---------- 9. 删除静态容器 ----------
ctr container rm nginx1
ctr container ls   # 已消失

4.2 一步到位运行容器(ctr run)

# 直接创建并运行容器(类似 docker run)
# --net-host 使用宿主机网络
ctr run -d --net-host nginx:latest nginx2

# 查看运行状态
ctr task ls

# 停止并删除(先停止 task,再删除 container)
ctr task kill nginx2
ctr task delete nginx2
ctr container rm nginx2

五、命名空间(Namespace)管理实验

Containerd 的 namespace 用于隔离容器和镜像资源,类似 Docker 的 namespace 概念。

# ---------- 1. 查看所有命名空间 ----------
ctr namespace ls
# 默认有一个 "default" 空间

# ---------- 2. 创建新命名空间 ----------
ctr namespace create myns
ctr namespace create testns

# ---------- 3. 在指定命名空间中操作 ----------
# 拉取镜像到 myns 空间
ctr -n myns images pull nginx:latest
# 查看 myns 中的镜像
ctr -n myns images ls

# 在 myns 中创建容器
ctr -n myns container create nginx:latest mynginx
ctr -n myns task start -d mynginx
ctr -n myns tasks ls

# ---------- 4. 删除命名空间 ----------
ctr namespace rm testns
# 注意:删除命名空间会删除其中的所有资源

六、nerdctl 实践(Docker 风格 CLI)

nerdctl 是兼容 Docker CLI 的 Containerd 客户端,推荐日常使用。

6.1 安装 nerdctl

# 1. 下载 nerdctl
wget https://github.com/containerd/nerdctl/releases/download/v1.4.0/nerdctl-1.4.0-linux-amd64.tar.gz

# 2. 解压到 /usr/bin
tar -xf nerdctl-1.4.0-linux-amd64.tar.gz -C /usr/bin/

# 3. 配置命令补全
nerdctl completion bash > /etc/bash_completion.d/nerdctl
source /etc/bash_completion.d/nerdctl

# 4. 下载 CNI 插件(网络需要)
wget https://github.com/containernetworking/plugins/releases/download/v1.3.0/cni-plugins-linux-amd64-v1.3.0.tgz
mkdir -p /opt/cni/bin
tar -xf cni-plugins-linux-amd64-v1.3.0.tgz -C /opt/cni/bin

# 5. 配置镜像加速(编辑 /etc/containerd/config.toml)
# 找到 [plugins."io.containerd.grpc.v1.cri".registry] 部分
# 添加 config_path = "/etc/containerd/certs.d"
mkdir -p /etc/containerd/certs.d/docker.io
cat > /etc/containerd/certs.d/docker.io/hosts.toml <<EOF
server = "https://docker.io"
[host."https://054b8ac70e8010d90f2ac00ef29e6580.mirror.swr.myhuaweicloud.com"]
  capabilities = ["pull", "resolve"]
EOF
systemctl restart containerd

6.2 nerdctl 镜像管理(与 Docker 语法一致)

# 查看镜像
nerdctl images
# 或 nerdctl image ls

# 拉取镜像
nerdctl pull busybox
nerdctl pull nginx:alpine

# 打标签
nerdctl tag busybox mybusybox:latest

# 导出镜像
nerdctl save busybox -o busybox.tar

# 导入镜像
nerdctl load -i busybox.tar

# 删除镜像
nerdctl rmi busybox

# 查看镜像历史
nerdctl history nginx:alpine

# 查看镜像详情
nerdctl inspect busybox

# 清理未使用的镜像
nerdctl image prune --all --force

6.3 nerdctl 容器管理

# ---------- 运行容器 ----------
# 交互式运行
nerdctl run -it ubuntu /bin/bash

# 后台运行并命名
nerdctl run -d --name mynginx -p 8080:80 nginx

# 设置重启策略
nerdctl run -d --restart always --name app redis

# ---------- 查看容器 ----------
nerdctl ps           # 仅运行中
nerdctl ps -a        # 所有容器
nerdctl ps --format "{{.Names}} {{.Status}}"

# ---------- 生命周期操作 ----------
nerdctl stop mynginx
nerdctl start mynginx
nerdctl restart mynginx
nerdctl pause mynginx
nerdctl unpause mynginx
nerdctl kill mynginx
nerdctl rm mynginx

# ---------- 进入容器执行命令 ----------
nerdctl exec -it mynginx /bin/sh
# 宿主机文件复制到容器
nerdctl cp /etc/hostname mynginx:/
# 容器文件复制到宿主机
nerdctl cp mynginx:/etc/nginx/nginx.conf ./

# ---------- 查看日志和端口 ----------
nerdctl logs mynginx
nerdctl port mynginx   # 显示端口映射

# ---------- 提交容器为镜像 ----------
nerdctl commit mynginx mynginx-custom:v1

# ---------- 清理停止的容器 ----------
nerdctl container prune --force

6.4 nerdctl 网络管理

# 查看网络列表
nerdctl network ls

# 查看 bridge 网络详情
nerdctl network inspect bridge

# 查看宿主机网桥
ip addr show nerdctl0
brctl show   # 需要安装 bridge-utils

6.5 nerdctl 存储卷管理

# 创建卷
nerdctl volume create mydata

# 查看卷列表
nerdctl volume ls

# 挂载卷运行容器
nerdctl run -d -v mydata:/data --name app busybox sleep infinity

# 挂载宿主机目录
mkdir /host_data
nerdctl run -d -v /host_data:/container_data busybox sleep infinity

# 查看卷详情
nerdctl volume inspect mydata

# 删除卷
nerdctl volume rm mydata

七、crictl 实践(Kubernetes CRI 调试工具)

crictl 是符合 CRI 接口的命令行工具,用于调试 Kubernetes 节点的容器运行时。

7.1 安装与配置

# 安装 crictl(通常通过 yum 安装 cri-tools)
yum install -y cri-tools

# 配置文件 /etc/crictl.yaml
cat > /etc/crictl.yaml <<EOF
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 5
debug: false
EOF

# 或通过命令设置
crictl config runtime-endpoint unix:///run/containerd/containerd.sock
crictl config image-endpoint unix:///run/containerd/containerd.sock

7.2 crictl 常用命令

# ---------- 镜像操作 ----------
crictl pull nginx:latest
crictl images          # 查看镜像
crictl inspecti nginx:latest   # 查看镜像详情
crictl rmi nginx:latest         # 删除镜像

# ---------- 容器操作 ----------
crictl ps              # 查看运行中容器
crictl ps -a           # 所有容器
crictl inspect <container-id>   # 查看容器详情
crictl logs <container-id>      # 查看日志
crictl exec -it <container-id> /bin/sh
crictl stop <container-id>
crictl rm <container-id>

# ---------- Pod 操作 ----------
crictl pods            # 查看所有 Pod Sandbox
crictl runp pod-config.json   # 运行 Pod
crictl stopp <pod-id>
crictl rmp <pod-id>

# ---------- 其他 ----------
crictl info            # 查看运行时信息
crictl stats           # 查看资源统计
crictl version

7.3 命令对照表

功能 docker nerdctl ctr crictl
查看容器 docker ps nerdctl ps ctr task ls crictl ps
查看镜像 docker images nerdctl images ctr image ls crictl images
拉取镜像 docker pull nerdctl pull ctr image pull crictl pull
删除容器 docker rm nerdctl rm ctr container rm crictl rm
删除镜像 docker rmi nerdctl rmi ctr image rm crictl rmi
执行命令 docker exec nerdctl exec ctr task exec crictl exec
查看日志 docker logs nerdctl logs crictl logs
查看详情 docker inspect nerdctl inspect ctr container info crictl inspect

八、实验总结与最佳实践

8.1 工具选型建议

使用场景 推荐工具 原因
本地开发/测试 nerdctl 语法与 Docker 完全兼容,学习成本低
生产 K8s 节点调试 crictl 符合 CRI 标准,直接与 kubelet 视角一致
Containerd 底层调试 ctr 官方原生工具,功能最全
Kubernetes 集群运行时 Containerd + runC 性能最优,K8s 官方推荐

8.2 关键概念区分

  • 静态容器 (Container):只有元数据,没有运行进程
  • 任务 (Task):实际运行的容器进程,每个任务对应一个容器实例
  • 命名空间 (Namespace):资源隔离单元,不同 namespace 中的容器/镜像互不可见
  • CRI:Kubernetes 定义的容器运行时接口标准

8.3 常见问题快速排查

# 1. containerd 服务状态
systemctl status containerd
journalctl -u containerd -f

# 2. 查看 containerd 配置
containerd config dump

# 3. 调试容器无法启动
ctr task start <container-id>   # 不加 -d 可看前台日志

# 4. 清理残留资源
ctr namespace ls                 # 检查 namespace
ctr -n <ns> containers ls       # 查看各 ns 容器
ctr -n <ns> tasks ls            # 查看任务

本文档涵盖了 Containerd 的核心原理、安装方法、镜像管理、容器生命周期、命名空间隔离、nerdctl 和 crictl 的完整实践。所有命令均包含详细注释,可直接在 CentOS Stream 8 环境中验证。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐