chat
docker 与 k8s 的区别与联系
一句话结论(先记住)
Docker 解决的是「应用怎么打包并在一台机器上跑」的问题 Kubernetes 解决的是「大量 Docker 应用如何在一堆机器上稳定地跑」的问题
👉 Docker = 单机级别的容器运行能力 👉 K8s = 集群级别的容器编排与管理系统
一、Docker 是什么(它解决了什么问题)
Docker 的核心目标
让应用 + 依赖 → 变成一个可移植、可重复运行的“标准单元”
Docker 主要做的事
从工程角度看,Docker 解决的是:
-
应用打包
- Dockerfile
- 镜像(Image)
-
容器运行
docker run- 进程隔离(namespace)
- 资源限制(cgroups)
-
基础生命周期管理
- start / stop / restart
- logs
- exec
Docker 的能力边界
Docker 擅长:
- 单机运行
- 开发 / 测试 / CI
- 简单部署
Docker 不擅长:
- 多机调度
- 自动扩缩容
- 服务发现
- 高可用
- 自愈
👉 Docker 本身不“懂”集群
二、Kubernetes 是什么(它补了 Docker 哪些坑)
K8s 的核心目标
在“不可靠的机器”上,持续、稳定地运行“大量容器应用”
K8s 关注的是:
- 机器会挂
- 容器会挂
- 流量会变
- 版本会升级
Kubernetes 主要做的事
1️⃣ 容器调度(Scheduler)
- 决定 哪个 Pod 跑在哪台 Node 上
- 考虑 CPU / 内存 / 亲和性 / 污点
2️⃣ 应用编排(Orchestration)
- Deployment / StatefulSet / DaemonSet
- 副本数管理
- 滚动更新
- 回滚
3️⃣ 服务治理
- Service(ClusterIP / NodePort / LoadBalancer)
- DNS
- 负载均衡
4️⃣ 自愈能力
- 容器挂了 → 自动拉起
- Node 挂了 → 重新调度
- 健康检查(liveness / readiness)
5️⃣ 弹性能力
- HPA(自动扩缩容)
- 按 CPU / QPS / 自定义指标
三、K8s 和 Docker 的关系(这是关键)
核心关系一句话
K8s 不负责“怎么创建容器”,它只负责“怎么用容器”
分层关系(非常重要)
应用代码
↓
Docker Image(镜像)
↓
容器运行时(Docker / containerd / CRI-O)
↓
Kubernetes(调度、管理、编排)
一个关键事实(很多人不知道)
K8s 并不依赖 Docker
- 早期:K8s 使用 Docker 作为默认运行时
- 现在:K8s 直接使用 containerd
-
Docker 只是:
- 镜像构建工具
- 开发体验工具
👉 生产环境 ≠ 一定要装 Docker
四、对照表(工程师最实用)
| 维度 | Docker | Kubernetes |
|---|---|---|
| 定位 | 容器技术 | 容器编排平台 |
| 关注点 | 单机容器运行 | 集群应用运行 |
| 规模 | 单机 / 少量容器 | 大规模集群 |
| 调度 | ❌ | ✅ |
| 自动重启 | 基础 | 强(自愈) |
| 自动扩缩容 | ❌ | ✅ |
| 服务发现 | ❌ | ✅ |
| 滚动升级 | ❌ | ✅ |
| 学习曲线 | 低 | 高 |
| 是否必须 | 开发必备 | 生产必备 |
五、一个真实落地场景对比
只有 Docker
docker run -d -p 8080:8080 my-app
问题:
- 进程挂了?
- 机器挂了?
- 流量暴涨?
- 升级怎么不影响用户?
你需要 自己写脚本 + 监控 + 负载均衡
使用 Kubernetes
replicas: 3
strategy:
type: RollingUpdate
K8s 自动帮你:
- 跑 3 个副本
- 挂一个补一个
- 滚动升级
- 负载均衡
六、工程化理解(给你一个“正确心智模型”)
Docker 是“集装箱” Kubernetes 是“港口调度系统”
- Docker:标准化货物
-
K8s:决定
- 放哪
- 放几个
- 坏了怎么办
- 高峰期加多少
七、什么时候用谁?
只用 Docker 就够
- 本地开发
- Demo
- 单机服务
- 学习阶段
必须上 K8s
- 多实例
- 高可用
- 微服务
- 自动扩缩容
- 生产系统
参考资料
https://milvus.io/docs/zh/install_standalone-docker.md
