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?

历史演变:

  1. 早期 Docker:所有功能都在一个 dockerd 进程中

  2. 问题:单点故障、升级困难、依赖复杂

  3. 解决方案:将运行时功能分离到 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

 

posted @ 2025-12-25 11:51  Peter.Jones  阅读(0)  评论(0)    收藏  举报