一、Containerd 核心概念(扩展版)

1.1 定义与定位

Containerd 是 CNCF 托管的开源轻量级容器运行时,专注容器全生命周期管理,遵循 OCI 运行时 + 镜像规范,是 Kubernetes 默认底层运行时。

1.2 核心能力(原文 + 扩展)

  • 容器生命周期:创建 / 运行 / 暂停 / 恢复 / 停止 / 删除
  • 镜像管理:拉取 / 推送 / 导出 / 导入 / 校验 / 挂载
  • 标准化接口:兼容 CRI、OCI,对接 K8s、Docker
  • 插件化架构:存储、网络、运行时、监控可扩展
  • 安全隔离:基于 Linux Namespace + Cgroups 强隔离
  • 高可用:Shim 解耦,守护进程重启不影响容器运行

1.3 关键生态关系(必懂知识点)

表格

组件 作用 与 Containerd 关系
runc OCI 标准运行时,真正创建容器进程 Containerd 通过 Shim 调用 runc
containerd-shim-v2 容器垫片,解耦 daemon 与容器 每个容器独立 shim,daemon 崩溃容器不掉线
CRI K8s 容器运行时接口 Containerd 实现 CRI,直接被 kubelet 调用
ctr Containerd 原生 CLI 底层调试,不兼容 docker 命令
crictl CRI 客户端 K8s 场景专用,管理 Pod / 容器 / 镜像
nerdctl 兼容 docker 命令的 CLI 生产推荐,替代 ctr

知识点:Containerd ≠ DockerDocker 是完整容器平台(含构建、网络、编排),现代 Docker 底层依然用 Containerd;Containerd 是专注运行时的最小核心,更轻、更稳、更适合 K8s。


二、运行架构(深度解析)

2.1 整体架构

  • C/S 架构:服务端暴露 Unix Socket /gRPC
  • 单节点管理:一个 Containerd 管控一台宿主机
  • 三层核心:存储层、元数据层、运行时层

2.2 核心组件详解

  1. Storage(存储)

    • Content:镜像层数据,内容寻址存储
    • Snapshot:容器读写层,OverlayFS 默认驱动
    • Diff:层差异计算,用于提交与构建
  2. Metadata(元数据)

    • Images:镜像标签、digest、大小、平台
    • Containers:容器配置、命名空间、运行时
  3. Runtime(运行时)

    • Tasks:容器内进程组,对应运行中实例
    • Events:容器事件流,用于监控与告警

2.3 Runtime v2 + Shim 原理(重磅扩展)

  • Containerd 不直接调用 runc,而是启动 containerd-shim-runc-v2 独立进程
  • Shim 负责:挂接 Namespace、调用 runc、转发标准输入输出、监听退出码
  • 价值:daemon 重启 / 崩溃,容器继续运行,可重连管理,实现高可用隔离

三、安装与配置(含所有命令 + 扩展)

3.1 安装 Containerd(CentOS / EulerOS 24)

bash

运行

# Step1 配置阿里云 Docker 源
curl -o /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# Step2 替换变量适配系统
sed -i 's/$releasever/8/g' /etc/yum.repos.d/docker-ce.repo
sed -i 's/$basearch/x86_64/g' /etc/yum.repos.d/docker-ce.repo

# Step3 查看可用版本
yum list containerd.io --showduplicates

# Step4 安装
yum -y install containerd.io

3.2 生成默认配置

bash

运行

mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml

3.3 镜像加速配置(原文完整 + 扩展说明)

bash

运行

# 编辑配置,启用 certs.d 配置目录
vim /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
mkdir -p /etc/containerd/certs.d/registry.k8s.io

# 配置 docker.io 加速
cat <<EOF | sudo tee /etc/containerd/certs.d/docker.io/hosts.toml
server = "docker.io"
[host."https://docker.m.daocloud.io"]
capabilities = ["pull", "resolve"]
EOF

# 配置 k8s 镜像加速
cat <<EOF | sudo tee /etc/containerd/certs.d/registry.k8s.io/hosts.toml
server = "registry.k8s.io"
[host."https://registry.aliyuncs.com/google_containers"]
capabilities = ["pull", "resolve"]
override_path = true
EOF

3.4 启动与校验

bash

运行

systemctl daemon-reload
systemctl enable --now containerd
systemctl status containerd

# 查看版本
ctr version

3.5 配置扩展知识点(生产必备)

  • root = "/var/lib/containerd":镜像 / 层数据存储路径
  • state = "/run/containerd":运行时状态、socket 路径
  • version = 3:最新配置版本,v1 已废弃
  • SystemdCgroup = true:K8s 必须开启,适配 systemd 驱动
  • snapshotter = "overlayfs":生产推荐,性能最优

四、镜像管理(原文所有命令 + 扩展)

4.1 拉取镜像

bash

运行

# 全平台
ctr images pull docker.io/library/nginx:latest \
  --all-platforms \
  --hosts-dir=/etc/containerd/certs.d/

# 指定架构
ctr images pull docker.io/library/nginx:latest \
  --platform linux/amd64 \
  --hosts-dir=/etc/containerd/certs.d/

4.2 查看 / 检查镜像

bash

运行

# 查看 default 命名空间
ctr images ls

# 查看 k8s.io 命名空间(K8s 镜像)
ctr -n k8s.io images ls

# 检查完整性
ctr images check

4.3 标签 / 删除 / 挂载 / 导出 / 导入

bash

运行

# 打标签
ctr images tag docker.io/library/nginx:latest nginx:v1

# 删除镜像
ctr images rm nginx:v1

# 挂载镜像到主机
ctr images mount nginx:v1 /mnt

# 卸载
ctr images unmount /mnt

# 导出(全平台)
ctr images export --all-platforms nginx_latest.tar docker.io/library/nginx:latest

# 导入
ctr images import nginx_latest.tar

镜像知识点扩展

  • ctr 必须写完整镜像路径(docker.io/library/xxx),不能省略
  • 镜像导出导入可用于离线环境分发
  • 镜像挂载可直接查看文件系统,用于调试与审计

五、容器与任务管理(原文全命令 + 原理)

5.1 核心概念

  • Container:静态配置(资源、镜像、命令)
  • Task:运行中的进程实例,真正承载业务

5.2 完整操作流程

bash

运行

# 1 创建容器(静态)
ctr containers create nginx:v1 nginx

# 2 启动任务(运行)
ctr task start -d nginx

# 3 查看运行中任务
ctr task ls

# 4 进入容器
ctr task exec --exec-id 0 -t nginx sh

# 5 暂停/恢复
ctr task pause nginx
ctr task resume nginx

# 6 停止(kill)
ctr task kill nginx

# 7 删除任务
ctr task rm nginx

# 8 删除容器
ctr containers rm nginx

# 9 查看资源 metrics
ctr task metrics nginx

# 10 查看容器内进程宿主机 PID
ctr task ps nginx

关键知识点

  • ctr 没有 stop,只有 kill,优雅停止需在容器内处理
  • --exec-id 必须唯一,用于区分多个 exec 会话
  • metrics 输出内存 / CPU/PID 限额与实时用量,可做监控

六、插件与命名空间(扩展原理)

6.1 插件体系

bash

运行

# 列出所有插件
ctr plugins ls

常见插件类型:

  • Snapshotter:overlayfs/devmapper/btrfs
  • Runtime:runc v2、kata、gVisor
  • Content:内容存储
  • CRI:对接 Kubernetes

插件化让 Containerd 成为统一运行时骨架,可替换底层实现。

6.2 命名空间(资源隔离)

bash

运行

# 查看
ctr ns ls

# 创建
ctr ns create test

# 删除
ctr ns rm test

# 指定命名空间操作
ctr -n test images pull ...
ctr -n test containers create ...

知识点:K8s 固定使用 k8s.io 命名空间,与 default 完全隔离,不可混用。


七、安全与生产最佳实践(补充)

  1. 禁用非 HTTPS 镜像仓库

    toml

    [plugins."io.containerd.grpc.v1.cri".registry.configs."docker.io".tls]
    insecure_skip_verify = false
    
  2. 使用 SystemdCgroup,防止资源逃逸
  3. OverlayFS 快照驱动,性能与稳定性最优
  4. 限制镜像并发拉取数,避免带宽打满
  5. 定期清理闲置镜像、快照,释放磁盘

八、常见问题速查(扩展)

  1. 拉取镜像超时检查 certs.d 配置、加速地址、网络连通性
  2. task start 失败确认容器已 create、无重名、镜像完整
  3. K8s 看不到镜像ctr -n k8s.io images ls 查看,必须在 k8s.io 命名空间
  4. daemon 重启后容器消失未使用 Runtime v2,或 shim 异常,重装新版 containerd

本章总结

本文完整覆盖原文安装、配置、镜像、容器、任务、插件、命名空间所有代码,并补充:

  • OCI/CRI 生态关系
  • Runtime v2 + Shim 高可用原理
  • 生产配置与安全基线
  • 常见问题排障
  • ctr/crictl/nerdctl 定位区别

Containerd 是云原生底层基石,掌握它可彻底理解容器运行机制,为 K8s 运维、性能调优、安全加固打下坚实基础。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐