转自
https://mp.weixin.qq.com/s/mNB-cZqQoJTBTEixsO5pHQ
Kubernetes 在 v1.24 版本中移除了 dockershim。为什么要移除?docker与k8s之间是什么关系?要理解 docker、docker daemon、k8s、dockershim、containerd 之间的关系,我们需要从各自的功能出发,逐步梳理它们的交互逻辑。
一、核心组件的功能解析
- Docker
• 定义:一个开源的容器化平台,提供了完整的工具链,让用户可以轻松构建、运行、分发容器。
• 核心功能:包含命令行工具(docker 命令)、镜像管理、容器生命周期控制等,是用户操作容器的"入口"。
• 本质:是一个"上层工具集",其底层依赖其他组件(如 docker daemon、containerd)实现具体功能。 - Docker Daemon(dockerd)
• 定义:Docker 的后台服务进程,是 Docker 平台的核心组件。
• 功能:
• 接收并处理 docker 命令行工具发送的请求(如 docker run、docker build)。
• 管理 Docker 镜像(下载、存储、缓存)。
• 协调底层组件(如 containerd)完成容器的创建、启动、停止等操作。
• 通信方式:通过 REST API 与 docker 命令行工具交互(默认使用 Unix 套接字 unix:///var/run/docker.sock)。 - containerd
• 定义:一个独立的、高性能的容器运行时(Container Runtime),负责容器的底层生命周期管理。
• 起源:最初是 Docker 内部的一个组件,2017 年被分离出来并捐给 CNCF(云原生计算基金会),成为独立项目。
• 核心功能:
• 管理容器的生命周期(创建、启动、停止、删除容器)。
• 管理容器的镜像(从仓库拉取、本地存储)。
• 与 Linux 内核交互(如通过 runc 调用 namespace、cgroup 等内核特性创建容器)。
• 关系:是 Docker 和 Kubernetes 等平台的"底层依赖",Docker Daemon 会通过 containerd 处理容器的实际运行逻辑。 - dockershim
• 定义:一个"适配器"组件,是 Kubernetes 为了兼容 Docker 而开发的临时解决方案。
• 背景:Kubernetes(k8s)通过 容器运行时接口(CRI) 与容器运行时交互(CRI 是 k8s 定义的标准接口),但 Docker 本身并不直接支持 CRI(Docker 的接口与 CRI 不兼容)。
• 功能:将 k8s 的 CRI 请求"翻译"为 Docker 能理解的指令,转发给 Docker Daemon,再由 Docker Daemon 调用 containerd 执行。
• 现状:Kubernetes 在 v1.24 版本中移除了 dockershim(因为 Docker 并非原生 CRI 运行时,而 containerd 是原生 CRI 运行时,可直接与 k8s 交互)。 - Kubernetes(k8s)
• 定义:开源的容器编排平台,负责大规模容器集群的部署、调度、扩展、自愈等管理工作。
• 核心需求:需要"容器运行时"来实际运行容器(k8s 本身不直接运行容器),因此依赖符合 CRI 标准的运行时(如 containerd)。
• 与其他组件的关系:通过 CRI 接口与容器运行时交互,实现对容器的间接管理。
二、组件之间的关系梳理 - Docker 内部的依赖链:
docker 命令行工具→ 发送请求给docker daemon→docker daemon调用containerd→containerd调用runc(内核级工具)→ 最终创建容器。
(即:用户通过docker run命令操作,实际由containerd 完成底层容器创建) - Kubernetes 与容器运行时的交互:
• 早期:k8s 需通过 dockershim 适配 Docker(因为 Docker 不支持 CRI),流程为:k8s(CRI)→ dockershim → docker daemon → containerd → 容器。
• 现在:k8s 直接与支持 CRI 的 containerd 交互(无需 dockershim),流程为:k8s(CRI)→ containerd → 容器。 - containerd 的独立性:
containerd 是独立的容器运行时,不仅被 Docker 依赖,也可被 k8s 直接使用(无需经过 Docker),是目前云原生领域的主流容器运行时。
三、关系总结图表
以下用"交互流程图"展示各组件的关系(左侧为早期依赖 dockershim 的场景,右侧为当前主流场景):

总结
• docker 是上层用户工具,依赖 docker daemon 和 containerd 实现功能。
• containerd 是底层容器运行时,是 Docker 和 k8s 的核心依赖,直接与内核交互。
• k8s 是编排平台,通过 CRI 与容器运行时交互(早期用 dockershim 适配 Docker,现在直接用 containerd)。
• dockershim 是历史遗留的"适配器",因 Docker 不兼容 CRI 而存在,现已被 k8s 移除。