本系列前 4 篇把 Docker 单机的能力讲透了——但单机 Docker 撑不起生产级 AI 系统。当你的服务要部署到几十台机器、几百个容器,跨主机调度、自动伸缩、滚动升级、灰度发布、跨节点网络——每一个都是全新的挑战。
这一篇我们走一遍容器编排 10 年的演化历程。它不是技术八卦,而是一堂架构课——理解每个方案为什么出现、又为什么被替代,你才能在自己的项目里做出正确选择。
一、Docker Swarm:编排 1.0(2014-2017)
1.1 出现的背景
2014 年 Docker 1.0 发布后,开发者们迅速意识到:单机 Docker 太舒服,但生产环境不可能只有一台机器。当时 Docker 公司的策略很清晰——「容器是新的进程,编排是新的 init」,Docker 应该像 Linux 内核之于进程一样,做容器世界的底层。
1.2 Swarm 是什么
Docker Swarm 是 Docker 公司在 2014 年底推出的内置集群方案。它把一组 Docker 引擎聚合成一个「虚拟的 Docker 引擎」,对外暴露统一的 API。
# 初始化集群(第一个 init 的节点自动成为 manager/leader)
docker swarm init
# 其他节点加入(worker 角色)
docker swarm join --token <worker-token> <manager-ip>:2377
# 查看节点列表
docker node list
# 创建一个 overlay 网络
docker network create -d overlay --attachable swarm_mysql
# 创建跨主机分布式服务
docker service create --replicas 3 --name web -p 80:80 nginx
1.3 Swarm 的关键设计
- Manager / Worker 角色:第一个执行
swarm init的节点是 Manager(leader),其他加入的是 Worker。所有管理操作必须在 Manager 上执行。 - Overlay 网络:基于 VXLAN 实现的跨主机虚拟网络,容器之间可以像在同一台机器上一样通信。
- 声明式服务:
docker service create而不是docker run——你描述「想要什么」,Swarm 负责「调度到哪、起几个」。 - 内置负载均衡:对外暴露端口后,Swarm 自动把请求分发给各个副本。
1.4 Swarm 的真实使用
在 2015-2017 年间,Swarm 是 Docker 官方主推的方案。当时很多中小团队用它做生产部署——相比自己写脚本维护多台机器,Swarm 已经是巨大的进步。
1.5 Swarm 失利的三个原因
- 生态弱势:Kubernetes 背后有 Google + Red Hat + 整个 CNCF 基金会,Swarm 只有 Docker 公司一家。
- 功能差距:Kubernetes 在自动伸缩、滚动更新、配置管理(ConfigMap/Secret)、存储编排(PV/PVC)上的能力远超 Swarm。
- 社区分裂:2016 年 KubeCon 大会后,Kubernetes 生态爆发,Swarm 的市场份额迅速下滑。
- Docker 公司战略调整:2017 年 DockerCon EU 上 Docker 公司宣布在 Docker Enterprise 中支持 Kubernetes(2018 年正式集成),Swarm 实质上被「战略放弃」。
到 2020 年前后,Swarm 在生产环境基本被 Kubernetes 取代。但它作为「容器编排入门」的概念——服务、副本、overlay 网络、声明式 API——全部被 Kubernetes 继承。
二、Docker Compose:单机王者
2.1 定位
如果说 Swarm 是「多机编排」,Compose 就是「单机编排的极致」。在前一篇 《Docker Compose 多容器编排》 我们已经详细讲过——它把一组 docker run 命令浓缩成一份 docker-compose.yml。
2.2 Compose vs Swarm
| 维度 | Compose | Swarm |
|---|---|---|
| 部署范围 | 单机 | 多机集群 |
| 学习曲线 | 平缓(一个 YAML 文件) | 较陡(节点角色、overlay 网络) |
| 适用场景 | 开发、测试、CI、小型生产 | 中型生产(已被 K8s 取代) |
| 现状 | 依然活跃 | 基本停止演进 |
2.3 为什么 Compose 没死
虽然 Swarm 死了,但 Compose 活得很好——因为它解决了一个 Swarm/Kubernetes 都没解决好的问题:本地开发体验。
docker-compose.yml 是开发环境的事实标准:
- 一行
docker compose up拉起整个后端依赖栈 - 团队成员环境完全一致
- 与 CI/CD 流水线无缝衔接
- 跟生产环境(即使是 K8s)解耦——开发不依赖 K8s 集群
Kubernetes 本身有 Kustomize、Helm,但「在笔记本上跑 K8s」始终是个痛点。Compose 凭借极简的语法赢了这个场景。
三、容器编排群雄逐鹿(2014-2017)
容器编排不是只有 Swarm 和 Kubernetes。事实上在 2014-2017 年间,至少有四款主流编排器同时竞争:
3.1 Apache Mesos(2009 启动,2014 引入容器)
- 定位:通用的「数据中心操作系统」,可以跑容器、跑 JVM 任务、跑大数据作业。
- 优点:成熟、久经考验,支持超大规模(10万+ 节点)。
- 缺点:太复杂,运维门槛高;Kubernetes 出现后失去容器编排方向的优势。
- 现状:在 Twitter、苹果等公司仍有使用,但生态基本停滞。
3.2 HashiCorp Nomad(2015)
- 定位:HashiCorp 推出的「轻量级调度器」,与 Consul、Vault 天然集成。
- 优点:二进制单文件部署、5 分钟跑起来、支持非容器工作负载(Java、binary)。
- 缺点:生态小,K8s 主导后增长放缓。
- 现状:在中小型公司、特定场景(混合 workload)有用户,但市场份额远小于 K8s。
3.3 Docker Swarm(2014)
- 上面已经分析。
3.4 Kubernetes(2014 年开源,2015 年 v1.0)
- 出身:Google 内部 Borg/Omega 系统 10 年经验的对外释放。
- 生态:Red Hat、CoreOS、华为、阿里、AWS、Azure、GCP 全部押注,CNCF 基金会孵化。
- 设计哲学:声明式 API + 控制循环 + 不可变基础设施。
3.5 竞争终局
2017 年 KubeCon 后,Kubernetes 实际上赢得了容器编排之战。到 2020 年,市场上几乎所有新的容器编排项目都选择「运行在 K8s 上」或「与 K8s 集成」,而不是另起炉灶。
四、为什么 Kubernetes 赢了
4.1 设计上:声明式 + 控制循环
Kubernetes 全部 API 都是声明式的——你告诉它「想要什么状态」(比如「3 个副本、CPU > 80% 时扩容」),控制循环持续把「实际状态」向「期望状态」收敛。这种模型对大规模系统极其友好。
4.2 生态上:CNCF 基金会
2015 年 Google 联合 Linux 基金会成立 CNCF(Cloud Native Computing Foundation),把 Kubernetes 捐给了基金会。这一步棋的深远影响是:没有任何一家公司能垄断它的演进方向——AWS 贡献 networking、Red Hat 贡献 operator、华为贡献 edge、CNCF 自己也做培训认证。
4.3 功能上:完整覆盖
- Pod:调度的最小单位(一个或多个共享网络和存储的容器)
- Deployment:声明副本数 + 滚动更新策略
- Service + Ingress:服务发现 + 七层路由
- ConfigMap + Secret:配置与敏感信息
- PersistentVolume + PersistentVolumeClaim:存储编排
- StatefulSet:有状态服务(数据库、消息队列)
- DaemonSet:每节点一个 Pod(日志收集、监控 agent)
- HorizontalPodAutoscaler:基于 CPU/内存/自定义指标的自动伸缩
- NetworkPolicy:精细的网络分段
- RBAC:基于角色的访问控制
- Operator 模式:把运维知识编码进控制器,自动化数据库、中间件的复杂操作
4.4 厂商绑定上:避免锁定
Kubernetes 在所有主流云上都是一等公民——EKS(AWS)、GKE(Google)、ACK(阿里云)、TKE(腾讯云)、AKE(百度云)、华为云 CCE。「可移植性」是它击败所有云厂商私有编排器的关键。
五、特殊集群方案:分布式数据库
在 Swarm 主导的 2015-2017 年间,还有一类「应用层集群」方案值得专门讲——它们解决的是有状态服务(特别是数据库)的集群问题,与容器编排平级但目标不同。
5.1 PXC(Percona XtraDB Cluster)
# 拉取 PXC 镜像
docker pull percona/percona-xtradb-cluster
# 启动主节点(必须先初始化集群)
docker run -d -p 9001:3306 \
-e MYSQL_ROOT_PASSWORD=root_pwd \
-e CLUSTER_NAME=PXCCluster \
-e XTRABACKUP_PASSWORD=cluster_pwd \
-v /root/pxc_data:/var/lib/mysql \
--privileged \
--name=pxc-node1 \
--net=swarm_mysql \
percona/percona-xtradb-cluster
# 启动从节点(通过 CLUSTER_JOIN 加入)
docker run -d -p 9002:3306 \
-e MYSQL_ROOT_PASSWORD=root_pwd \
-e CLUSTER_NAME=PXCCluster \
-e XTRABACKUP_PASSWORD=cluster_pwd \
-e CLUSTER_JOIN=pxc-node1 \
-v /root/pxc_data:/var/lib/mysql \
--privileged \
--name=pxc-node2 \
--net=swarm_mysql \
percona/percona-xtradb-cluster
PXC 的特性:
- 基于 Galera 协议的多主同步复制——任何节点都可读写,所有节点同步完毕数据才算事务提交。
- 强一致性,适合保存高价值数据(金融、订单、用户账户)。
- 缺点:写性能受集群最慢节点限制(同步等待);网络抖动时容易脑裂。
5.2 MySQL Replication 集群
# 拉取 replication 镜像
docker pull mishamx/mysql
# 启动主节点
docker run -d -p 9001:3306 \
-e MYSQL_MASTER_PORT=3306 \
-e MYSQL_ROOT_PASSWORD=root_pwd \
-e MYSQL_REPLICATION_USER=repl_user \
-e MYSQL_REPLICATION_PASSWORD=repl_pwd \
-v rep_data:/var/lib/mysql \
--privileged \
--name=mysql-master \
--net=swarm_mysql \
mishamx/mysql
# 启动从节点
docker run -d -p 9002:3306 \
-e MYSQL_MASTER_PORT=3306 \
-e MYSQL_ROOT_PASSWORD=root_pwd \
-e MYSQL_REPLICATION_USER=repl_user \
-e MYSQL_REPLICATION_PASSWORD=repl_pwd \
-e MYSQL_MASTER_HOST=mysql-master \
-v rep_data:/var/lib/mysql \
--privileged \
--name=mysql-slave \
--net=swarm_mysql \
mishamx/mysql
Replication 的特性:
- MySQL 原生的主从异步复制——主节点读写、从节点只读。
- 最终一致性,主从之间有秒级延迟。
- 优点:读性能可线性扩展(多加 slave),写性能不受影响。
- 缺点:主节点单点(需要 VIP / MHA / Orchestrator 做主从切换),主从延迟下从节点可能读到旧数据。
5.3 PXC vs Replication:何时选哪个
| 场景 | 推荐 | 理由 |
|---|---|---|
| 金融、订单、账户 | PXC | 强一致,零数据丢失 |
| 读多写少的报表库 | Replication | 一主多从,线性扩展读 |
| 全球部署(多机房) | Replication | 异步复制可容忍跨地域延迟 |
| 高频写 | Replication | 同步等待会拖慢 PXC 写性能 |
在 Kubernetes 时代:PXC、Replication 这些方案依然有效,但通常通过 Operator 部署(如 Percona Operator for MySQL、MySQL Operator for Kubernetes),由 Operator 处理集群生命周期、备份、恢复、自动故障转移。
六、容器生态的当下与未来
6.1 当下格局
- Kubernetes 主导:新项目几乎默认 K8s。
- Compose 活得好:开发环境的事实标准。
- Docker Desktop 集成 K8s:单机也能跑 K8s。
- 云原生生态成熟:服务网格(Istio / Linkerd)、可观测性(Prometheus / Grafana / Loki)、CI/CD(Argo / Tekton / Flux)、安全(Falco / OPA)。
6.2 AI 时代的新趋势
- GPU 调度:K8s 通过 NVIDIA Device Plugin 支持 GPU 分配,KubeRay、Volcano 等项目专门优化 AI 训练任务的调度。
- Serverless 容器:Knative、Cloud Run、阿里云 ASK——按请求计费、秒级启动。
- WebAssembly + 容器:Spin、WasmEdge 把 Wasm 容器作为轻量替代品,毫秒级冷启动。
- AI 原生编排:KubeRay(Ray on K8s)、Kserve(模型服务)、Volcano(批量训练)成为新热点。
6.3 选型决策树
你的项目需要多机部署吗?
├── 否 → Docker Compose
└── 是
├── 需要自动伸缩、滚动更新、跨主机网络?
│ ├── 是 → Kubernetes
│ └── 否 → 考虑 K3s(轻量 K8s 发行版,单二进制)
└── 有特殊 workload(非容器)?
└── 是 → Nomad
七、系列总结
走到这里,本系列 5 篇就告一段落了。我们走过的路:
- 《Docker 入门》:为什么需要容器化
- 《Docker 核心概念与安装》:镜像、容器、仓库、Dockerfile + 第一次构建
- 《Docker 数据持久化与网络》:Volume + 容器间通信
- 《Docker Compose 多容器编排》:声明式管理多容器应用
- 本篇:容器编排 10 年演化,理解 Swarm/Compose/K8s/PXC/Replication 的位置
一句话总结:Compose 是开发环境的王者,Kubernetes 是生产环境的标准,PXC/Replication 等应用层集群是有状态服务的搭档。理解它们各自解决的问题和历史定位,你就能在「单机 Compose」和「生产 K8s」之间游刃有余。