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 更成熟的生态系统
安全性 平手 都支持各种安全特性
相关推荐
玩电脑的辣条哥2 小时前
Docker Compose 环境变量未生效与镜像标签缺失问题的排查与解决
运维·docker·容器
Wpa.wk3 小时前
Docker容器隔离(namespace+cgroups)-底层原理
运维·docker·容器
修己xj3 小时前
Docker 部署 PicGo:一次配置,随处使用
运维·docker·容器
Ha_To3 小时前
2026.1.29 docker的使用
运维·docker·容器
Free Tester3 小时前
在Docker Node环境下安装包
docker·容器
Wpa.wk3 小时前
Docker - 搭建镜像仓库- 了解
运维·经验分享·测试工具·docker·容器
liux35285 小时前
基于kubeadm构建K8S高可用集群:从理论到实践
云原生·容器·kubernetes
海兰5 小时前
Docker单节点部署Elasticsearch 9.0+(开发环境)
运维·docker·容器
人间打气筒(Ada)5 小时前
Docker主机集群化方案 Docker Swarm
运维·docker·容器·docker swarm·docker stack