Containerd vs Docker:详细对比

一、核心区别概述

特性 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?

  1. 开发环境

    开发者的日常工作流

    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 更成熟的生态系统
安全性 平手 都支持各种安全特性
相关推荐
打工仔折腾 AI3 小时前
飞牛OS上用Docker Compose部署ExerciseDiary运动记录并配置远程访问
运维·人工智能·后端·python·docker·容器·ai agent 实战
天衍四九-4 小时前
Docker Compose企业实战系列(八·终章):多环境隔离实战,开发/测试/生产一键切换
运维·docker·容器
ysu_03145 小时前
Docker-Desktop-WSL2实战指南-Windows从安装配置到项目容器化
windows·python·docker·容器·composer·dockerfile·wsl2
陈陈CHENCHEN6 小时前
【Kubernetes】纯 IPv6 K8s 集群访问外部 IPv4 服务
云原生·容器·kubernetes
明王明王7 小时前
从零搭建一个 AI Infra 实验室⑫:Docker 为什么默认看不到 GPU
人工智能·docker·容器
天衍四九-7 小时前
Docker Compose企业实战系列(四):Redis生产级部署|密码加固、持久化、内存优化完整方案
redis·docker·容器
troy1287 小时前
如何在谷歌云(Google Cloud)上部署 Kubernetes 集群
云原生·容器·kubernetes
guo_wen_qiang7 小时前
docker安装常见软件集合
运维·docker·容器
Zhu75819 小时前
离线二进制部署-Kubernetes-v1.36.4
容器·贪心算法·kubernetes
天衍四九-20 小时前
Docker容器实战系列(八):Docker生产最佳实践与避坑指南,系列终章
运维·docker·容器