1. Docker 的早期定位
Docker 是 最早的容器运行时工具(2013 年推出),最初是一个集成化工具链,包含以下核心功能:
- 容器运行时:运行容器(底层依赖 Linux 内核的 cgroups 和 namespaces)。
- 镜像构建:通过
Dockerfile构建容器镜像(docker build)。 - 镜像分发:通过
Docker Hub分发镜像(docker push/pull)。 - 容器管理:通过 CLI(
docker run/stop/rm等命令)管理容器生命周期。
在早期,Docker 是一个“全家桶”,用户只需安装 Docker 即可完成所有容器操作。
2. 为什么会被拆分为 containerd?
随着容器技术生态的发展,Kubernetes 等编排工具需要更轻量、更专注的容器运行时,而 Docker 的“大而全”架构逐渐显得冗余。为了适应这种需求,Docker 的架构开始模块化拆分:
- 2016 年:Docker 将底层容器运行时功能剥离为独立的组件 containerd,并将其捐赠给 CNCF(云原生计算基金会)。
- containerd 的定位:
- 专注于容器的核心生命周期管理(创建、启动、停止、删除等)。
- 不包含镜像构建、分发等上层功能(这些仍由 Docker 处理)。
3. Docker 与 containerd 的关系
拆分后,Docker 的架构变为:
Docker CLI(用户命令)
↓
Docker Engine(守护进程)
↓
containerd(底层容器运行时)
↓
runc(实际创建容器的 OCI 工具)
- Docker 引擎:负责镜像管理、API 接口、网络和存储等高级功能。
- containerd:负责底层容器生命周期管理(与
runc交互)。
此时,Docker 仍然包含 containerd,但 containerd 也可以独立运行,并被其他工具(如 Kubernetes)直接调用。
4. 为什么 Kubernetes 转向直接使用 containerd?
Kubernetes 最初依赖 Docker 作为默认运行时,但 Docker 的复杂性(如 Docker Engine、Docker CLI)在集群环境中显得冗余。因此,Kubernetes 社区推动使用更轻量的容器运行时:
- CRI(Container Runtime Interface):Kubernetes 定义的标准接口,要求容器运行时实现 CRI 才能与 Kubernetes 集成。
- Docker 的劣势:Docker 本身不直接实现 CRI,需通过
cri-dockerd桥接,增加了复杂度。 - containerd 的优势:
- 原生支持 CRI,可直接与 Kubernetes 集成。
- 更轻量、性能更好,资源占用更低。
因此,Kubernetes 逐步弃用 Docker,推荐使用 containerd 或 CRI-O 作为默认容器运行时。
5. 当前的 Docker 和 containerd
- Docker 仍然存在:
Docker 依然是一个完整的开发工具链,适合本地开发、测试和小规模部署(尤其是单机环境)。用户仍可使用docker build和docker run等命令。 - containerd 的独立性:
containerd 已成为行业标准的容器运行时,被 Kubernetes、Amazon ECS 等平台广泛使用。它专注于核心功能,不提供镜像构建或 CLI 工具。
总结
- Docker 被拆分:指其底层容器运行时功能剥离为独立的 containerd,但 Docker 本身依然存在,只是架构更模块化。
- containerd 的定位:专注于容器生命周期管理,成为 Kubernetes 等平台的默认选择。
- 使用场景:
- Docker:适合开发、单机环境(需要完整工具链)。
- containerd:适合生产集群(轻量、高效)。

被折叠的 条评论
为什么被折叠?



