05、containerd 容器概述
05、containerd 容器概述
官方文档: https://containerd.io
2016年12月14日,Docker公司宣布将containerd从Docker中分离,交由开源社区独立发展和运营。containerd是一个完整的容器运行时,可独立运行并管理容器,其主要职责是镜像管理和容器执行。它通过containerd-shim
接口层向下对接runc
项目,实现容器运行时与Docker Daemon的解耦,使得Docker Daemon可以独立升级。
containerd能够在宿主机上管理完整的容器生命周期,包括:
- 容器镜像的传输与存储
- 容器的创建、执行与销毁
- 存储管理(管理镜像及容器数据)
- 网络管理(管理容器网络接口及网络)
- 调用
runc
等符合OCI规范的运行时执行容器操作
ctr: containerd 的命令行客户端工具。
1、containerd 与 Docker 的关系
Docker 包含 containerd 作为其容器运行时核心。containerd 专注于容器生命周期的底层管理(运行时),而 Docker 在此基础上提供了更上层的功能,例如镜像构建、用户友好的CLI和API等。
containerd 提供的API较为底层,主要面向容器编排工具开发者等集成用户,而非最终用户。
2、containerd 在容器生态中的角色
containerd 主要定位是嵌入更上层的系统(如Kubernetes等容器编排平台),作为其容器运行时组件,而非直接面向最终用户。
它以守护进程(daemon)形式运行在宿主机上,通过Unix Domain Socket暴露底层的gRPC API。上层系统通过这些API来管理宿主机上的容器生命周期、镜像、存储和网络。
3、 Kubernetes 弃用 Docker 支持,转向 containerd 的原因
核心原因在于:containerd 更轻量、资源占用更低,且 Docker 底层本身依赖 containerd。
Kubernetes 等工具通过容器运行时接口(CRI)调用容器运行时(如 containerd、CRI-O)来实际完成容器的创建、运行和销毁工作。Docker 自身使用 containerd 作为其运行时。Kubernetes 在 1.24 版本之前支持使用 Docker(通过 dockershim),但从 1.24 版本开始正式弃用 Docker 支持,转而直接支持 containerd、CRI-O 等符合 OCI 规范的容器运行时。这些运行时最终通过 runc
与操作系统内核交互来管理容器。
关键概念说明
- CRI (Container Runtime Interface): Kubernetes 定义的一个插件接口,使 kubelet 能够使用不同的容器运行时。集群中的每个节点都需要安装一个兼容的容器运行时,kubelet 才能启动 Pod 及其容器。CRI 是 kubelet 与容器运行时之间通信的主要协议。
- OCI (Open Container Initiative): 一个由 Linux 基金会支持的开源项目,致力于制定容器格式(OCI Image Spec)和运行时(OCI Runtime Spec)的开放行业标准。主流的容器运行时(如 runc, containerd, CRI-O)都遵循 OCI 规范。
性能与资源占用优化
当使用 Docker 作为 Kubernetes 容器运行时时,调用链较长:kubelet
–> dockershim
(内置于旧版 kubelet) –> dockerd
(Docker Daemon) –> containerd
当直接使用 containerd 作为 Kubernetes 容器运行时时,调用链显著缩短:kubelet
–> CRI plugin
(内置于 containerd) –> containerd
优势:
性能提升: 调用链缩短,减少了中间环节的通信开销。
资源占用降低: containerd 是一个纯粹的容器运行时,去除了 Docker 附带的其他非必要功能,因此内存和CPU占用更少。