docker、docker daemon、k8s、dockershim、containerd之间的关系

转自

https://mp.weixin.qq.com/s/mNB-cZqQoJTBTEixsO5pHQ

Kubernetes 在 v1.24 版本中移除了 dockershim。为什么要移除?docker与k8s之间是什么关系?要理解 docker、docker daemon、k8s、dockershim、containerd 之间的关系,我们需要从各自的功能出发,逐步梳理它们的交互逻辑。

一、核心组件的功能解析

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

总结

• docker 是上层用户工具,依赖 docker daemon 和 containerd 实现功能。

• containerd 是底层容器运行时,是 Docker 和 k8s 的核心依赖,直接与内核交互。

• k8s 是编排平台,通过 CRI 与容器运行时交互(早期用 dockershim 适配 Docker,现在直接用 containerd)。

• dockershim 是历史遗留的"适配器",因 Docker 不兼容 CRI 而存在,现已被 k8s 移除。

相关推荐
明明跟你说过5 小时前
【k8s】资源限制管理:Namespace、Deployment与Pod的实践
运维·docker·云原生·容器·kubernetes·k8s
2301_794333917 小时前
实验室服务器配置|通过Docker实现Linux系统多用户隔离与安全防控
linux·服务器·docker·实验室
JCGKS8 小时前
Docker|“ssh: connect to host xxx.xxx.xxx.xxx port 8000: Connection refused“问题解决
docker·ssh·端口·listen·tcp三次握手
惜.己9 小时前
Docker启动失败 Failed to start Docker Application Container Engine.
spring cloud·docker·eureka
scugxl9 小时前
centos7 docker离线安装
运维·docker·容器
计算机小手11 小时前
AI 驱动数据分析:开源 SQLBot 项目探索,基于大模型和 RAG 实现精准问数与图表挖掘
经验分享·docker·开源软件
AI大模型12 小时前
基于Docker+DeepSeek+Dify :搭建企业级本地私有化知识库超详细教程
docker·llm·deepseek
张璐月13 小时前
go docker-compose启动前后端分离项目 踩坑之旅
开发语言·docker·golang
剑客的茶馆15 小时前
新服务器从0开始搭配Ubuntu+Conda+Docker+Dify
服务器·ubuntu·docker·conda·dify