Docker Swarm 集群编排实战:服务、滚动更新、Secrets 与负载均衡

Docker Swarm 集群编排完整实战:Swarm 模式与节点角色(Manager/Worker)、初始化与加入集群、Service 与副本、滚动更新与回滚、Secret/Config 管理、ingress 负载均衡与路由、集群高可用与故障转移,以及 Swarm vs K8s 的选型与迁移。

Kubernetes 之外,Docker 官方自带内置编排器——Swarm 模式(Swarm Mode)。不需要额外组件,docker swarm init 一条命令就能把多台 Docker 主机编成一个集群,获得 Service 调度、滚动更新、负载均衡与内置 Secrets。对于中小规模、想"够用就好"的团队,Swarm 是比 K8s 更轻的编排选择。本指南从集群搭建到生产运维完整讲透。

关键概念:Swarm 把一组 Docker 主机抽象为一个集群,角色分 Manager(管理面 + 可选调度)与 Worker(执行面)。你声明"我要 3 个副本",Swarm 负责把它们调度到可用节点、健康自愈、对外负载均衡。


1. Swarm 模式与节点角色

1.1 集群拓扑

Swarm 集群结构:
  Manager(管理节点):
    - 维护集群状态(Raft 共识)
    - 接收服务声明、做调度决策
    - 也可作为 Worker 跑任务(可选)
  Worker(工作节点):
    - 只执行被调度的任务
    - 不参与管理面

高可用:
  多个 Manager(奇数个,3 或 5)用 Raft 选主
  Manager 挂了会自动切换,集群不中断

1.2 初始化与加入集群

# 第一台主机(Manager)初始化
docker swarm init --advertise-addr 192.168.1.10

# 得到加入 token,其他主机加入:
# Worker 加入
docker swarm join --token WORKER_TOKEN 192.168.1.10:2377
# 或 Manager 加入
docker swarm join --token MANAGER_TOKEN 192.168.1.10:2377

# 查看节点状态
docker node ls

2. Service:Swarm 的编排单元

2.1 创建与伸缩服务

# 创建服务:3 个副本,端口 8080 暴露
docker service create \
  --name web \
  --replicas 3 \
  --publish published=8080,target=80 \
  nginx:alpine

# 查看服务与任务
docker service ls
docker service ps web        # 每个任务的调度与状态

# 扩容/缩容
docker service scale web=5
关键概念:
  Service  = 声明式服务定义(镜像、副本、端口、环境)
  Task     = 一个副本的调度单元(一个容器)
  Swarm 保证"期望副本数"永远被满足
  → 节点挂了,自动在健康节点重建 Task

2.2 服务更新与回滚

# 滚动更新镜像(update-config:并行度与失败动作)
docker service update \
  --image web:2.0 \
  --update-parallelism 1 \
  --update-delay 5s \
  --update-failure-action rollback \
  web

# 手动回滚
docker service rollback web

# 更多更新选项:
#   --update-order start-first / stop-first(先起后停)
#   --update-monitor 30s(每批健康检查窗口)

ℹ️ 核心:Swarm 的滚动更新内置并行度 + 延迟 + 失败自动回滚,配合健康检查,让发布风险可控。这通常是把"手工 docker run 重启"升级为"编排发布"的第一步。


3. Secrets 与 Configs

3.1 Secret:敏感信息的内置管理

# 创建 secret(Swarm 加密存储、仅授予需要的服务)
printf "db-pass-2026" | docker secret create db_pass -

# 挂载到服务(以只读文件形式出现在容器内)
docker service create \
  --name db \
  --secret db_pass \
  postgres:16

# 容器内:/run/secrets/db_pass
# Swarm 用 TLS 加密把 secret 传给需要它的节点,避免明文躺在节点上

3.2 Config:非敏感配置

# 与 secret 类似但非加密,用于配置文件/非敏感参数
docker config create nginx.conf ./nginx.conf

docker service create \
  --name web \
  --config source=nginx.conf,target=/etc/nginx/nginx.conf \
  nginx:alpine
对比:
  Secret  → 敏感(密钥、密码),加密、最小授权
  Config  → 非敏感(配置),明文可共享
  两者都支持"更新不重建镜像",容器只读挂载

4. 负载均衡与网络

4.1 ingress 负载均衡

Swarm 内置 ingress 网络:
  --publish published=8080,target=80
  → 集群内任何节点访问 8080 都会负载均衡到 3 个副本

特性:
  - 从任意节点入口都可达(Routing Mesh)
  - 副本分布在多个节点 → 单点故障不影响
  - 基于 IPVS/iptables 做 L4 转发

4.2 服务间通信(overlay 网络)

# 创建 overlay 网络,服务可互相发现
docker network create --driver overlay mynet

docker service create --name api --network mynet --replicas 3 ...
docker service create --name front --network mynet ...
# front 用 DNS 名 "api" 即可访问(内置服务发现)

5. 高可用与故障转移

5.1 节点故障自愈

场景:Worker 节点宕机
  Swarm 检测到节点失联 → 把它上的 Task 视为失败
  → 在其他健康节点重建,保持期望副本数

Manager 高可用:
  - 多个 Manager 用 Raft 保持状态一致
  - Manager 故障自动选主(quorum 要求多数存活)
  - 生产建议:3 或 5 个 Manager

5.2 约束与放置策略

# 用标签约束任务落在特定节点
docker node update --label-add ssd=true worker-1

docker service create \
  --name cache \
  --constraint node.labels.ssd==true \
  redis:7
放置维度:
  - node.labels:按标签(硬件/机房)
  - placement.preferences:按偏好分散(如按机架)
  - constraint:硬性约束
  用于:把有状态任务放到有 SSD 的节点、跨机架分散副本

6. 集群排障与运维

常见排查:
  docker service ls / ps  看服务与任务状态
  docker service logs web  看日志
  docker node ls           看节点健康
  docker network ls        看网络
  docker node inspect      看节点资源

备份:
  - 管理面状态需要备份(/var/lib/docker/swarm)
  - 用 docker swarm 导出/导入或定期快照

升级:
  - 先升 Manager 再升 Worker
  - 注意 API 兼容(跨大版本谨慎)
# 服务日志(不带 -f 看历史)
docker service logs --tail 50 web

7. Swarm vs Kubernetes:怎么选

对比:
  维度            Swarm                 K8s
  复杂度          低(内置、命令少)     高(组件多、概念多)
  扩展性          中小规模够用           大规模、生态丰富
  存储            Volume/插件            完整 CSI
  服务网格        -                       Istio/Linkerd
  Operator/CRD    -                      成熟
  社区与招聘       较少                   主流

选型建议:
  - 团队小、编排需求简单 → Swarm 更快上手
  - 需要完整云原生生态 → K8s
  - Swarm 到 K8s:概念迁移平缓(Service/副本/滚动更新相通)

8. 最佳实践清单

□ 生产用 3/5 个 Manager 保障 Raft 高可用
□ Service 声明副本数,别手工 docker run
□ 滚动更新设 parallelism/delay/failure-action=rollback
□ 敏感信息用 Secret,非敏感用 Config
□ 用 overlay 网络做服务发现,别硬编码 IP
□ 用 node labels + constraint 控制放置
□ 定期检查 docker service ls / node ls 健康
□ 备份 Swarm 管理面状态
□ 升级先 Manager 后 Worker,跨大版本谨慎

一句话原则

Swarm 把多台 Docker 变成"声明式编排集群",
复杂度低于 K8s,却拥有调度、更新、均衡、自愈全套能力。

小结

Docker Swarm 集群编排让团队用最小的学习成本获得编排能力:swarm init/join 搭集群、service create/scale/update 做声明式发布、内置 Secret/Config 管配置、ingress + overlay 网络做均衡与服务发现、多 Manager 保高可用。落地记住五件事:Manager/Worker 角色与 3/5 奇数 Manager 高可用、Service 声明副本数靠调度自愈、滚动更新配 rollback、Secret/Config 与 overlay 网络内置、需要云原生生态再上 K8s。当部署从"手动起容器"升级为"声明期望状态、Swarm 自动达成",中小团队的交付稳定性和运维效率就迈上了新的台阶。

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「DevOps」更多文章

  1. 备份与容灾自动化:RPO/RTO、Velero、PITR 与恢复演练
  2. 配置漂移与安全基线:IaC漂移检测、CIS合规、供应链安全与密钥轮换
  3. 内部开发者平台(IDP)工程化:Backstage、Golden Path 与自服务能力