一、核心区别概述
| 特性 | Docker | Containerd |
|---|---|---|
| 定位 | 完整的容器解决方案(包含用户界面) | 容器运行时核心引擎 |
| 架构层级 | 高层容器平台 | 底层容器运行时 |
| 包含组件 | Docker CLI, Docker Daemon, containerd, runc 等 | 仅容器运行时核心 |
| 复杂度 | 较复杂,功能齐全 | 更轻量、专注 |
| API | REST API (HTTP) | gRPC API |
| 镜像管理 | Docker Registry, Docker Hub | 通过 CRI 插件管理 |
| 网络管理 | Docker Network (bridge, overlay等) | 无,需上层管理 |
| 存储管理 | Docker Volume | 无,需上层管理 |
| 编排集成 | Docker Swarm(内置) | 通过 CRI 支持 Kubernetes |
二、架构对比
2.1 Docker 架构
┌─────────────────────────────────────┐
│ Docker Client │
│ (docker CLI, docker-compose) │
└─────────────────────────────────────┘
↓
┌─────────────────────────────────────┐
│ Docker Daemon │
│ (dockerd - 包含 containerd 和 runc) │
└─────────────────────────────────────┘
↓
┌─────────────────────────────────────┐
│ Containerd │
│ (容器生命周期管理、镜像管理) │
└─────────────────────────────────────┘
↓
┌─────────────────────────────────────┐
│ Runc │
│ (实际创建容器的 OCI 运行时) │
└─────────────────────────────────────┘
2.2 Containerd 架构
┌─────────────────────────────────────┐
│ Kubernetes (kubelet) │
│ 或其他容器平台 │
└─────────────────────────────────────┘
↓
┌─────────────────────────────────────┐
│ CRI (Container Runtime Interface)│
└─────────────────────────────────────┘
↓
┌─────────────────────────────────────┐
│ Containerd (作为 CRI 插件) │
│ ┌─────────────────────────────┐ │
│ │ Containerd Core │ │
│ │ - 镜像管理 (content) │ │
│ │ - 容器管理 (container) │ │
│ │ - 任务管理 (task) │ │
│ └─────────────────────────────┘ │
└─────────────────────────────────────┘
↓
┌─────────────────────────────────────┐
│ Runtime (shim) │
│ ┌─────────────────────────────┐ │
│ │ runc (默认) │ │
│ │ gVisor、Kata等 │ │
│ └─────────────────────────────┘ │
└─────────────────────────────────────┘
三、功能对比
3.1 相同点
| 功能 | Docker | Containerd |
|---|---|---|
| 容器创建/删除 | ✅ | ✅ |
| 镜像拉取/推送 | ✅ | ✅ |
| 容器生命周期管理 | ✅ | ✅ |
| 支持 OCI 标准 | ✅ | ✅ |
| 支持 Linux/Windows | ✅ | ✅ |
| 命名空间隔离 | ✅ | ✅ |
| cgroups 资源限制 | ✅ | ✅ |
3.2 不同点
| 功能 | Docker | Containerd | 说明 |
|---|---|---|---|
| 命令行工具 | ✅ docker |
✅ ctr nerdctl |
Docker CLI 功能更丰富 |
| 用户友好性 | ✅ 很好 | ⚠️ 需要学习 | Docker 对新手更友好 |
| 容器网络 | ✅ Docker Network | ❌ 需 CNI 插件 | Docker 自带网络方案 |
| 容器存储 | ✅ Docker Volume | ❌ 需 CSI 插件 | |
| 日志管理 | ✅ docker logs |
⚠️ 有限支持 | |
| Docker Compose | ✅ 支持 | ❌ 不支持 | |
| Swarm 编排 | ✅ 内置 | ❌ 不支持 | |
| Kubernetes 集成 | ⚠️ 需 Docker-Shim | ✅ 原生通过 CRI | |
| 安全扫描 | ✅ Docker Scan | ❌ 不支持 | |
| 构建镜像 | ✅ docker build |
⚠️ buildkit |
|
| 镜像签名 | ✅ Notary | ❌ 不支持 |
四、性能对比
4.1 资源占用
# Docker 进程树
systemd
└─ dockerd
└─ docker-containerd
└─ docker-containerd-shim
└─ container-process
# Containerd 进程树(Kubernetes 场景)
systemd
└─ containerd
└─ containerd-shim
└─ container-process
内存占用:
-
Docker Daemon:约 50-100MB
-
Containerd:约 20-40MB
-
结论:Containerd 更轻量
4.2 启动速度
Docker 启动容器
time docker run --rm alpine echo "hello"
使用 ctr 启动容器
time ctr run --rm docker.io/library/alpine:latest test echo "hello"
结果:Containerd 通常快 100-200ms
五、使用场景
5.1 何时使用 Docker?
-
开发环境
开发者的日常工作流
docker build -t myapp .
docker run -p 8080:80 myapp
docker-compose up
2.单机部署
# 简单的应用部署
docker swarm init
docker stack deploy -c docker-compose.yml myapp
3.CI/CD 流水线
# Jenkins/GitLab CI 中
docker build ...
docker push ...
4.需要完整工具链
# 需要网络、存储、日志等完整功能
docker network create mynet
docker volume create myvol
docker logs -f container
5.2 何时使用 Containerd?
1.Kubernetes 生产环境
# Kubernetes 配置
apiVersion: v1
kind: Node
spec:
containerRuntimeVersion: containerd://1.6.0
2.边缘计算/IoT 设备
# 资源受限环境
# Containerd 占用资源更少
3.需要更安全的运行时
# 使用 gVisor 或 Kata Containers
containerd config default | grep runtime
4.定制化容器平台
// 使用 Containerd 的 Go 客户端
client, _ := containerd.New("/run/containerd/containerd.sock")
六、命令行工具对比
6.1 Docker CLI vs ctr
# ============ 镜像管理 ============
# Docker
docker pull ubuntu:20.04
docker images
docker rmi ubuntu:20.04
# ctr (Containerd)
ctr image pull docker.io/library/ubuntu:20.04
ctr image ls
ctr image rm docker.io/library/ubuntu:20.04
# ============ 容器管理 ============
# Docker
docker run -d --name nginx nginx:alpine
docker ps
docker exec -it nginx sh
docker stop nginx
docker rm nginx
# ctr
ctr run -d docker.io/library/nginx:alpine nginx
ctr task ls
ctr task exec -t --exec-id 1 nginx sh
ctr task kill nginx
ctr container rm nginx
# ============ 容器网络 ============
# Docker(内置网络)
docker network create mynet
docker run --network=mynet ...
# Containerd(需 CNI)
# 需要额外配置网络插件
6.2 nerdctl(更好的 Containerd CLI)
# nerdctl 提供类似 Docker 的体验
nerdctl pull nginx:alpine
nerdctl run -d -p 80:80 --name nginx nginx:alpine
nerdctl ps
nerdctl logs nginx
nerdctl compose up # 支持 Docker Compose
七、Kubernetes 集成
7.1 历史演变
Docker (旧版) → Docker + dockershim → Containerd (现在)
7.2 Kubernetes 配置
# 查看当前运行时
kubectl get node -o wide
# 输出包含:containerRuntimeVersion: containerd://1.6.0
# 安装 Kubernetes 时指定
kubeadm init --cri-socket /run/containerd/containerd.sock
八、总结
| 方面 | 胜出者 | 说明 |
|---|---|---|
| 易用性 | Docker | 更好的用户体验 |
| 性能 | Containerd | 更轻量,启动更快 |
| Kubernetes 兼容性 | Containerd | 原生支持,无 shim 层 |
| 功能完整性 | Docker | 网络、存储、构建等 |
| 社区生态 | Docker | 更成熟的生态系统 |
| 安全性 | 平手 | 都支持各种安全特性 |