containerd
containerd 是容器运行时的核心组件,是现代容器技术的基石。
1. 什么是 containerd?
简化的理解:
传统:Docker Daemon → 直接管理容器
现代:Docker Daemon → containerd → runc → 容器
详细架构:
用户/CLI → Docker CLI → Docker Daemon → containerd → containerd-shim → runc → 容器进程
│
└─ 高级功能(镜像、网络、存储等)
2. containerd 的主要职责
# 容器生命周期管理 - 创建、启动、停止、删除容器 - 容器监控和状态管理 # 镜像管理 - 拉取、推送、管理镜像 - 镜像存储和分层 # 存储管理 - 管理容器文件系统 - 管理卷(volumes) # 网络管理 - 容器网络命名空间 - CNI(容器网络接口)插件集成
3. 为什么需要 containerd?
历史演变:
-
早期 Docker:所有功能都在一个
dockerd进程中 -
问题:单点故障、升级困难、依赖复杂
-
解决方案:将运行时功能分离到
containerd
架构优势:
# 传统单体架构 Docker Engine: - API 服务 - 镜像管理 - 容器运行时 - 网络管理 - 存储管理 # 所有功能耦合在一起 # 现代微服务架构 Docker Daemon: # 高级功能 - API 服务 - 镜像构建 - 用户界面 containerd: # 核心运行时 - 容器生命周期 - 镜像分发 - 存储管理 runc: # 低层容器创建 - 创建 OCI 容器
4. containerd 与其他组件的关系
# 查看容器运行时组件 ps aux | grep -E "(docker|containerd|runc)" # 典型输出: # root 1234 0.0 0.1 123456 7890 ? Ssl 10:00 0:00 /usr/bin/dockerd # root 5678 0.0 0.1 98765 4321 ? Ssl 10:00 0:00 /usr/bin/containerd # root 9012 0.0 0.0 1234 567 ? S 10:01 0:00 containerd-shim -namespace moby ...
5. containerd 的重要性:为什么需要停止它?
# 当你停止 Docker 时:
systemctl stop docker
# 但是 containerd 仍在运行 → 容器可能仍在运行!
# 因此需要同时停止:
systemctl stop docker docker.socket containerd
原因分析:
# 检查 containerd 是否在管理你的问题容器 ctr --namespace moby containers list | grep f3589d47142f # 或者直接查看 containerd 的容器 ctr containers ls
6. containerd 相关命令
# 查看状态 systemctl status containerd # 查看日志 journalctl -u containerd -f # 配置文件位置 ls -la /etc/containerd/ cat /etc/containerd/config.toml
# 查看帮助 ctr --help # 查看容器 ctr containers list # 查看任务(运行中的容器) ctr tasks list # 停止任务 ctr task kill <容器ID> # 删除容器 ctr containers delete <容器ID>
7. 在 Kubernetes 中的角色
# Kubernetes 使用 containerd 作为运行时
kubelet → CRI (Container Runtime Interface) → containerd → runc → 容器
# 因此,即使卸载了 kubelet,containerd 可能还在管理容器
8. 实际应用:如何操作 containerd
查看和管理 containerd 中的容器:
# 使用 crictl(CRI 工具) crictl ps -a crictl stopp <容器ID> crictl rmp <容器ID> # 或者使用 ctr ctr --namespace k8s.io containers list
调试容器问题:
# 查看容器详细信息 ctr containers info f3589d47142f # 查看容器日志 ctr containers logs f3589d47142f
9. containerd 与 Docker 的启动顺序
# 正确启动顺序 1. containerd # 容器运行时核心 2. docker # 高级管理接口 # 如果顺序错误,Docker 无法连接到 containerd

浙公网安备 33010602011771号