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

截至 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 负责"管"(编排调度)。

相关推荐
hx862272 小时前
Java MySQL 连接
java·mysql·adb
aq55356002 小时前
SpringBoot有几种获取Request对象的方法
java·spring boot·后端
Detachym3 小时前
InsightFlow 服务配置优化与部署实践
java·spring boot·tomcat·maven·状态模式·jar
y = xⁿ3 小时前
【LeetCodehot100】T23:合并k个升序链表
java·数据结构·链表
流水武qin3 小时前
SpringAI多模态的基本使用
java·spring boot·spring·ai
共享家95273 小时前
Java入门(多态)
java·开发语言
不吃香菜kkk、3 小时前
通过夜莺n9e监控Kubernetes集群
安全·云原生·容器·kubernetes
毕设源码-赖学姐3 小时前
【开题答辩全过程】以 基于Java的婚礼策划平台的设计与实现为例,包含答辩的问题和答案
java·开发语言
吾诺3 小时前
Spring Boot--@PathVariable、@RequestParam、@RequestBody
java·spring boot·后端