Containerd 容器技术详解
·
一、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 核心组件详解
-
Storage(存储)
- Content:镜像层数据,内容寻址存储
- Snapshot:容器读写层,OverlayFS 默认驱动
- Diff:层差异计算,用于提交与构建
-
Metadata(元数据)
- Images:镜像标签、digest、大小、平台
- Containers:容器配置、命名空间、运行时
-
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 完全隔离,不可混用。
七、安全与生产最佳实践(补充)
- 禁用非 HTTPS 镜像仓库
toml
[plugins."io.containerd.grpc.v1.cri".registry.configs."docker.io".tls] insecure_skip_verify = false - 使用 SystemdCgroup,防止资源逃逸
- OverlayFS 快照驱动,性能与稳定性最优
- 限制镜像并发拉取数,避免带宽打满
- 定期清理闲置镜像、快照,释放磁盘
八、常见问题速查(扩展)
- 拉取镜像超时检查 certs.d 配置、加速地址、网络连通性
- task start 失败确认容器已 create、无重名、镜像完整
- K8s 看不到镜像用
ctr -n k8s.io images ls查看,必须在 k8s.io 命名空间 - daemon 重启后容器消失未使用 Runtime v2,或 shim 异常,重装新版 containerd
本章总结
本文完整覆盖原文安装、配置、镜像、容器、任务、插件、命名空间所有代码,并补充:
- OCI/CRI 生态关系
- Runtime v2 + Shim 高可用原理
- 生产配置与安全基线
- 常见问题排障
- ctr/crictl/nerdctl 定位区别
Containerd 是云原生底层基石,掌握它可彻底理解容器运行机制,为 K8s 运维、性能调优、安全加固打下坚实基础。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐
所有评论(0)