在前面的几篇文章中,我们已经解决了几个核心问题:
- Docker 进阶(一):掌握镜像、容器、Dockerfile 等基础
- Docker 进阶(二):理解网络与数据卷,解决通信与数据持久化
- Docker 进阶(三):吃透镜像 Layer 与缓存机制,优化构建与发布效率
当应用进入 多实例、高可用、可扩缩容 阶段时,一个新的问题不可避免地出现:
如何在多台机器上,统一管理、调度、扩缩、恢复这些容器?
这正是 容器编排(Container Orchestration) 要解决的问题。
一、为什么需要容器编排?
在生产环境中,容器绝不会只是 docker run 那么简单。
1️⃣ 现实中的问题
- 一个服务需要 多个副本
- 容器异常退出,需要 自动重启
- 多个服务之间存在 依赖关系
- 需要 滚动更新,而不是一次性停服
- 流量需要 负载均衡
- 不同环境(测试 / 预发 / 生产)配置不同
如果继续靠脚本和人工操作,很快就会失控。
二、容器编排的核心能力
无论是 Docker Swarm 还是 Kubernetes,本质都在解决同一类问题:
| 能力 | 说明 |
|---|---|
| 服务声明 | 描述“我想要什么”,而不是“我怎么做” |
| 调度 | 自动把容器分配到合适的节点 |
| 副本管理 | 保证服务副本数符合预期 |
| 自愈能力 | 容器或节点异常时自动恢复 |
| 服务发现 | 服务之间通过名称通信 |
| 负载均衡 | 请求自动分发到多个实例 |
| 滚动更新 | 平滑发布新版本 |
三、Docker Swarm:Docker 官方的编排方案
1️⃣ 什么是 Docker Swarm?
Docker Swarm 是 Docker 内置的集群与编排系统,特点是:
- 零额外安装
- 与 Docker CLI 完全一致
- 学习成本低
- 适合中小规模集群
一句话总结:
Swarm = Docker 原生的“轻量级 Kubernetes”
2️⃣ Swarm 的核心概念
| 概念 | 说明 |
|---|---|
| Node | 集群中的一台机器 |
| Manager | 负责调度和集群状态 |
| Worker | 运行容器的节点 |
| Service | 一个服务定义 |
| Task | Service 的具体实例 |
3️⃣ 初始化 Swarm 集群
docker swarm init
查看节点:
docker node ls
4️⃣ 使用 Service 部署应用
docker service create \
--name web \
--replicas 3 \
-p 80:80 \
nginx
此时你会发现:
- 不需要自己做负载均衡
- 任意节点访问 80 端口都能命中服务
- 容器挂了会自动拉起
5️⃣ 使用 docker-compose 进行 Swarm 编排
version: "3.8"
services:
web:
image: nginx
deploy:
replicas: 3
restart_policy:
condition: on-failure
ports:
- "80:80"
部署:
docker stack deploy -c docker-compose.yml myapp
6️⃣ Swarm 的优缺点
优点:
- 学习曲线低
- 原生 Docker 支持
- 快速上手
缺点:
- 生态相对较小
- 社区活跃度下降
- 不适合超大规模集群
四、Kubernetes:事实上的行业标准
1️⃣ 为什么 Kubernetes 会成为主流?
Kubernetes(K8s)最初由 Google 推出,如今已成为 云原生事实标准:
- 公有云全面支持(阿里云 / AWS / GCP)
- 强大的扩展能力
- 成熟的生态体系
- 超大规模实践验证
一句话总结:
Swarm 更像“工具”,Kubernetes 更像“平台”。
2️⃣ Kubernetes 的核心对象
| 对象 | 作用 |
|---|---|
| Pod | 最小调度单元 |
| Deployment | 无状态应用管理 |
| Service | 服务发现与负载均衡 |
| ConfigMap | 配置管理 |
| Secret | 敏感信息管理 |
| Ingress | 七层流量入口 |
3️⃣ 一个最简单的 Deployment 示例
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
spec:
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
部署:
kubectl apply -f deployment.yaml
4️⃣ Kubernetes 的核心优势
- 声明式配置(期望状态)
- 强大的自动化能力
- 高度可扩展
- 完整的云原生生态
5️⃣ Kubernetes 的挑战
- 学习曲线陡峭
- 概念多、对象多
- 运维复杂度高
五、Swarm vs Kubernetes:如何选择?
| 维度 | Docker Swarm | Kubernetes |
|---|---|---|
| 学习成本 | ⭐ | ⭐⭐⭐⭐ |
| 上手速度 | 快 | 慢 |
| 集群规模 | 小~中 | 中~超大 |
| 生态 | 较弱 | 极其丰富 |
| 云厂商支持 | 一般 | 一流 |
| 未来趋势 | 弱化 | 主流 |
选择建议
- 小团队 / 内部系统 / 学习阶段 → Docker Swarm
- 中大型项目 / 云原生 / 长期演进 → Kubernetes
六、前端与容器编排的真实落地场景
对前端工程师来说,编排并不是“运维专属”。
常见应用场景
- 前端 多环境部署
- SSR / Node 服务的 横向扩展
- 前端网关 / BFF 服务
- 灰度发布与回滚
- CI/CD 自动部署
当你写下第一份 Deployment YAML,
就真正走进了 云原生工程师 的世界。
七、小结
在这一篇中,我们完成了一个重要的跃迁:
从“管理容器”,到“管理服务与集群”。
你现在已经具备了:
- 理解容器编排的必要性
- 使用 Docker Swarm 快速构建集群
- 认识 Kubernetes 的核心价值
- 根据项目规模选择合适方案
下一篇预告
Docker 进阶(五):Docker + CI/CD —— 从代码提交到自动部署
我们将把 Docker、镜像优化、编排能力真正串进 工程化流水线。
文章评论