什么是 Docker 和 K8s 的区别
一句话概括:Docker 管的是一个容器怎么跑起来,K8s 管的是一堆容器怎么排班。下面依次讲清两者的定位差异、各自的工作方式、为什么它们不是替代关系,以及在什么规模下才真的需要 K8s。

Docker 是什么:把应用打包成镜像
Docker 是一个容器工具,它把应用和它依赖的库、配置一起打包成一个镜像。镜像就像一份预制菜的真空包装,菜、调料、分量都封好了,换到哪台机器打开都能还原同样的味道。所以 Docker 解决的核心问题是环境不一致,也就是“我本地能跑、线上跑不起来”。

容器本身不神秘:它靠 Linux 的命名空间做隔离,靠 cgroups 限制 CPU 和内存。

所以容器比虚拟机轻——它不模拟整套硬件,也不跑完整的操作系统内核。启动一个容器通常是一两秒的事,一台机器上跑几十上百个很常见。

Docker 的边界:主要在一台机器上工作
你用 Docker 命令启动、停止、看日志,都是针对本机。管理多个容器可以用 docker compose,但那也是单机编排。
机器一多,谁该放在哪台、挂了由谁来顶替,Docker 自己不管。

K8s 是什么:容器编排系统
K8s 全称 Kubernetes,是一个容器编排系统。它不负责打包镜像,它负责把镜像调度到集群里某台机器上运行,并且持续盯着:你要三个副本,少一个就补一个。
K8s 里几个关键对象要认识:
- 节点:集群中的机器。
- Pod:最小调度单位,里面装一个或几个关系紧密的容器。
- Deployment:描述我要几个什么镜像的副本。
- Service:给一组 Pod 一个固定入口,Pod 换了 IP 也不影响访问。
这些对象都写在 YAML 文件里,交给 K8s 去对账。

对账:期望状态与实际状态
对账这个词很关键。你写的 YAML 是期望状态,K8s 不断比较实际状态和期望状态,不一致就动手修。所以机器宕机、容器崩溃、流量突增要扩容,它都能自动处理。这是 Docker 单机模式给不了的能力。

命令式与声明式:操作方式的差别
Docker 是命令式的,你敲一条命令,它执行一次动作。K8s 是声明式的,你只描述结果,过程由系统自己收敛。这个差别决定了 Docker 更顺手于开发调试,K8s 更适合长期运维。

常见误区:上了 K8s 就不需要 Docker
很多人以为上了 K8s 就不再需要 Docker,其实两者角色不同。K8s 自己不打包镜像,它通过容器运行时来启动容器,现在常见的是 containerd。Docker 仍然是最常用的镜像构建工具,它产出的镜像标准和 K8s 使用的是同一套。

典型链路是这样的:开发用 Docker 打出镜像,推到镜像仓库,K8s 再从仓库拉下来,在集群里运行。Docker 负责把服务做成标准件,K8s 负责把标准件调度到岗位上。所以它们是配合关系,不是竞争关系。

常见误区:把 K8s 当成 Docker 的升级版
升级版的意思是功能更强、旧的不必再用,但这里不成立。Docker 面对的是一台机器上的容器生命周期,K8s 面对的是一个集群的整体状态,层级根本不同。

实践场景:同一套镜像,不同副本数
大促前流量是平时的五倍,K8s 里配一条自动扩容规则,CPU 超过阈值就多加几个 Pod,流量回落后再缩回来。同一套镜像,测试环境两个副本,生产环境二十个副本,改的只是 YAML 里的数字。

什么时候不该用 K8s
一个小项目、一两台服务器,Docker 加 compose 就够用。上 K8s 意味着要多维护一套控制平面,学习和运维成本都不低。
它的价值在规模:几十个服务、多台机器、要求高可用和弹性伸缩时,才真正划算。

成本与复杂度
K8s 抽象层次多,出问题排查要穿过 Pod、Service、Ingress 好几层,网络和存储配置也更复杂。它不是更高级所以更好,而是更复杂,但换来了规模化调度能力。
学习顺序
先把 Docker 的镜像、容器、端口映射和数据卷摸清,能独立把一个服务打包跑起来。再去理解 K8s 的 Pod、Deployment、Service 这三件套。跳过 Docker 直接学 K8s,多半会在镜像和网络报错时卡住。

常见问题
Docker 和 K8s 是替代关系吗? 不是。Docker 负责把服务做成标准件,K8s 负责把标准件调度到岗位上,两者是配合关系。
上了 K8s 还需要 Docker 吗? 需要,两者角色不同。典型链路是开发用 Docker 打出镜像、推到镜像仓库,K8s 再从仓库拉下来在集群里运行。
K8s 是 Docker 的升级版吗? 不成立。Docker 面对的是一台机器上的容器生命周期,K8s 面对的是一个集群的整体状态,层级根本不同。
小项目要不要上 K8s? 一个小项目、一两台服务器,Docker 加 compose 就够用。它的价值在规模,几十个服务、多台机器、要求高可用和弹性伸缩时才划算。
总结
Docker 是容器的打包和运行工具,K8s 是容器的调度和管理平台。前者解决一致性问题,后者解决规模问题。选型看的是你现在管几个服务、几台机器,而不是哪个名字更热。


