Containerd 容器管理工具核心总结与实验指南
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 环境中验证。
更多推荐



所有评论(0)