Containerd:容器生态中的核心组件¶
在容器技术生态系统中,Docker和containerd是两个至关重要的组件。Docker作为最流行的容器管理工具,其底层运行时依赖于containerd。本文旨在深入探讨Docker与containerd的关系、技术架构及其在容器生态系统中的角色。
Docker与containerd的关系¶
![/assets/images/docker-arch.jpg]
从图中可以看出,Docker 对容器的管理和操作基本都是通过 containerd 完成的。 Containerd 是一个工业级标准的容器运行时,它强调简单性、健壮性和可移植性。Containerd 可以在宿主机中管理完整的容器生命周期,核心功能有:
- 管理容器的生命周期(从创建容器到销毁容器)
- 拉取/推送容器镜像
- 存储管理(管理镜像及容器数据的存储)
- 调用 runC 运行容器(与 runC 等容器运行时交互)
- 管理容器网络接口及网络
注意:Containerd 被设计成嵌入到一个更大的系统中,而不是直接由开发人员或终端用户使用。
为什么需要 containerd¶
我们可以从下面几点来理解为什么需要独立的 containerd:
- 继续从整体 docker 引擎中分离出的项目(开源项目的思路)
- 可以被 Kubernets CRI 等项目使用(通用化)
- 为广泛的行业合作打下基础(就像 runC 一样)
重复一遍:Containerd 被设计成嵌入到一个更大的系统中,而不是直接由开发人员或终端用户使用。所以 containerd 具有宏大的愿景(此图来自互联网):
当 containerd 和 runC 成为标准化容器服务的基石后,上层的应用就可以直接建立在 containerd 和 runC 之上。上图中展示的容器平台都已经支持 containerd 和 runC 的组合了,相信接下来会有更多类似的容器平台出现。
Containerd 的技术方向和目标
- 简洁的基于 gRPC 的 API 和 client library
- 完整的 OCI 支持(runtime 和 image spec)
- 同时具备稳定性和高性能的定义良好的容器核心功能
- 一个解耦的系统(让 image、filesystem、runtime 解耦合),实现插件式的扩展和重用
下图展示了 containerd 的架构(此图来自互联网):
在架构设计和实现方面,核心开发人员在他们的博客里提到了通过反思 graphdriver 的实现,他们将 containerd 设计成了 snapshotter 的模式,这也使得 containerd 对于 overlay 文件系、snapshot 文件系统的支持比较好。 storage、metadata 和 runtime 的三大块划分非常清晰,通过抽象出 events 的设计,containerd 也得以将网络层面的复杂度交给了上层处理,仅提供 network namespace 相关的一些接口添加和配置 API。这样做的好处无疑是巨大的,保留最小功能集合的纯粹和高效,而将更多的复杂性及灵活性交给了插件及上层系统。
containerd的核心功能¶
容器生命周期管理¶
containerd负责容器的创建、启动、停止、删除等操作,确保容器的高效运行。
镜像管理¶
支持镜像的拉取、存储和管理,为容器提供必要的运行环境。
运行时支持¶
containerd支持多种容器运行时,如runc、gVisor等,提供了灵活的运行时选择。
插件机制¶
containerd提供了灵活的插件扩展能力,支持自定义功能,增强了其适应性和扩展性。
Docker与containerd的协同工作¶
高层与底层的分工¶
Docker负责高层功能,如镜像构建、网络管理、存储管理,而containerd专注于底层容器运行时。
分离设计的优势¶
Docker与containerd的分离设计不仅使得Docker更加模块化,也便于与其他容器工具集成,提高了整个容器生态系统的灵活性和互操作性。
技术亮点¶
containerd的插件机制¶
containerd的插件机制支持自定义运行时和存储插件,为容器生态提供了高度可扩展性。
容器运行时标准化¶
作为CNCF(云原生计算基金会)项目,containerd推动了容器运行时的标准化和互操作性。