截至 2026 年 ,现代 K8s 集群(v1.24+)的标准配置是使用 containerd 或 CRI-O 作为容器运行时。
📜 历史演变:从"绑定"到"解耦"
为了让你清楚来龙去脉,我们简单回顾一下:
- 早期 (K8s v1.23 之前) :
- K8s 强依赖 Docker。
- 问题 :K8s 需要通过一个名为
dockershim的中间层组件才能和 Docker 对话。这增加了复杂度、降低了性能,且 Docker 包含了很多 K8s 不需要的功能(如镜像构建、CLI 工具),导致资源浪费。
- 转折点 (K8s v1.20 - v1.23) :
- K8s 社区宣布 弃用 (Deprecate) Docker 支持。
- 警告用户:未来版本将彻底移除
dockershim。
- 现在 (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)、容器网络、卷挂载等核心概念是完全通用的。
工作流变化:
- 本地 :用
docker build构建镜像 ->docker push推送到仓库。 - 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 写
一句话总结:Docker 负责"生"(构建镜像),containerd 负责"养"(运行容器),K8s 负责"管"(编排调度)。