Kubernetes (K8s) 底层早已不再直接使用 Docker 引擎

5 阅读4分钟

截至 2026 年,现代 K8s 集群(v1.24+)的标准配置是使用 containerdCRI-O 作为容器运行时。


📜 历史演变:从“绑定”到“解耦”

为了让你清楚来龙去脉,我们简单回顾一下:

  1. 早期 (K8s v1.23 之前)
    • K8s 强依赖 Docker。
    • 问题:K8s 需要通过一个名为 dockershim 的中间层组件才能和 Docker 对话。这增加了复杂度、降低了性能,且 Docker 包含了很多 K8s 不需要的功能(如镜像构建、CLI 工具),导致资源浪费。
  2. 转折点 (K8s v1.20 - v1.23)
    • K8s 社区宣布 弃用 (Deprecate) Docker 支持。
    • 警告用户:未来版本将彻底移除 dockershim
  3. 现在 (K8s v1.24 及以后,包括 2026 年的主流版本)
    • dockershim** 被彻底移除**。
    • K8s 不再支持直接将 Docker Engine 作为容器运行时。
    • 如果你尝试在新版 K8s 中配置 --container-runtime=docker,启动会失败。

🏗️ 现在的架构:CRI 标准接口

K8s 现在通过 CRI (Container Runtime Interface,容器运行时接口) 标准与底层运行时通信。这意味着 K8s 可以对接任何符合 CRI 标准的运行时,而不仅仅是 Docker。

主流运行时对比

特性Docker Engine (旧方式)containerd (当前主流)CRI-O (轻量级)
定位完整的容器平台 (构建+运行+管理)专注容器运行的生命周期管理专为 K8s 设计的轻量运行时
K8s 集成已不支持 (需 dockershim,已删)原生支持 (直接对接 CRI)原生支持 (直接对接 CRI)
性能较低 (多层封装,调用链长) (架构精简,启动快)极高 (代码库最小)
资源占用高 (守护进程庞大)极低
镜像构建支持 (docker build)❌ 不支持 (需用 buildah/kaniko)❌ 不支持
生态地位开发者的本地工具K8s 节点的标准运行时K8s 专用运行时

💡** 关键冷知识**:其实 Docker Engine 自己底层也是调用的 containerd 来运行容器。

  • 以前:K8s -> dockershim -> Docker Daemon -> containerd -> 容器
  • 现在:K8s -> CRI -> containerd -> 容器
  • 结果:去掉中间商(Docker Daemon),效率更高,故障点更少。

🤔 常见疑问解答

Q1: 既然 K8s 不用 Docker 了,我还需要学 Docker 吗?

需要!而且非常重要。

  • 构建镜像docker build 依然是目前最流行、最方便的镜像构建方式。你在本地开发时,依然用 Docker 打包镜像。
  • 本地调试:Docker Desktop 依然是本地运行容器的最佳工具。
  • 概念通用:容器镜像格式 (OCI Image)、容器网络、卷挂载等核心概念是完全通用的。

工作流变化

  1. 本地:用 docker build 构建镜像 -> docker push 推送到仓库。
  2. K8s 集群:K8s 拉取镜像 -> 调用 containerd -> 运行容器。
    (你不需要在集群节点上安装 Docker Engine)

Q2: 我的旧集群如果还在用 Docker 怎么办?

  • 如果你的集群版本低于 v1.24,它可能还在用 Docker。
  • 建议:尽快升级集群版本,并迁移到 containerd。这是官方推荐的生产环境标准。大多数云厂商的托管 K8s (如阿里云 ACK, AWS EKS) 默认已经使用 containerd。

Q3: 那我怎么在 K8s 节点上调试容器?

既然没有 docker 命令了,怎么查看日志或进入容器?

  • 方法一 (推荐):使用 kubectl exec -it <pod-name> -- bash 直接进入容器。
  • 方法二:使用 crictl 命令。这是 CRI 兼容的命令行工具,专门用来调试 containerd/CRI-O。
    • 例如:crictl ps (查看容器), crictl logs <id> (查看日志)。
  • 方法三:很多发行版(如 K3s, Docker Desktop)为了方便,依然会在后台安装 docker CLI 并配置它连接到 containerd,让你能继续用 docker 命令,但这只是兼容性包装,底层跑的已经不是 Docker Engine 了。

🚀 总结

  • K8s 底层跑的是什么?containerd (最常见) 或 CRI-O
  • Docker 死了吗? 没死。它依然是开发阶段构建和运行容器的王者,只是退出了生产环境编排运行的舞台。
  • 你需要做什么?
    • 继续用 Docker 写 Dockerfile 和构建镜像。
    • 在部署 K8s 集群时,选择默认集成 containerd 的方案(如 K3s, Kubeadm + containerd, 或云厂商托管服务)。
    • 不要再尝试在新版 K8s 中安装和配置 Docker Engine 作为运行时。

一句话总结:Docker 负责“生”(构建镜像),containerd 负责“养”(运行容器),K8s 负责“管”(编排调度)。