Docker Swarm 集群实战指南:从搭建到生产落地的完整攻略
在容器编排领域,Kubernetes 的强大无需多言,但对于中小规模应用或追求轻量化部署的场景,Docker 原生的 Swarm 集群工具更具优势 ------ 无需额外部署复杂组件,与 Docker 引擎深度集成,上手成本低且能满足高可用、弹性扩缩容的核心需求。本文将从核心概念拆解、集群搭建实战、生产环境落地三个维度,带你全面掌握 Docker Swarm 的使用技巧。
一、Docker Swarm 核心概念解析
Docker Swarm 的本质是将多台 Docker 主机抽象为一个虚拟集群,通过统一入口管理所有节点的容器资源。理解以下核心概念,是掌握 Swarm 集群的基础:
1.1 集群架构核心组件
| 组件 | 核心作用 | 关键说明 |
|---|---|---|
| 管理节点(Manager Node) | 集群控制中心,负责配置管理、服务调度、状态同步 | 需部署奇数个(3/5 个) 保证高可用,通过 Raft 一致性协议同步配置,避免脑裂 |
| 工作节点(Worker Node) | 接收管理节点指令,运行容器实例 | 无集群管理权限,数量可根据算力需求灵活扩展 |
| 服务(Service) | 集群编排核心单元 | 定义容器镜像、副本数、网络配置等规则,替代单机 docker run 命令 |
| 任务(Task) | 服务的最小执行单元 | 对应一个具体容器实例,服务副本数为 3 时会创建 3 个任务分发到不同节点 |
| 栈(Stack) | 多服务组合管理单元 | 基于 Compose 文件(版本 ≥3.0),支持一键部署/更新/销毁关联应用(如前端+后端+数据库) |
1.2 关键网络与存储概念
| 概念 | 类型 | 核心作用 |
|---|---|---|
| Overlay 网络 | 跨节点虚拟网络 | 实现不同节点容器互通,内置服务发现(容器可通过服务名直接通信) |
| Ingress 网络 | 特殊 Overlay 网络 | Swarm 自动创建,用于服务负载均衡,外部请求通过 IPVS 路由到可用容器 |
| 集群卷(Volume) | 数据持久化存储 | 支持本地卷/网络卷(NFS/GlusterFS),跨节点共享数据需用网络卷保证一致性 |
二、Docker Swarm 集群搭建实战
2.1 前置准备条件
- 操作系统:所有节点系统一致(推荐 Ubuntu 20.04+/CentOS 7+);
- 网络配置:关闭防火墙或放行关键端口:
- 2377/tcp(集群管理)
- 7946/tcp/udp(节点通信)
- 4789/udp(Overlay 网络);
- Docker 环境:所有节点安装 Docker ≥19.03,启动服务并配置镜像加速;
- 网络互通:节点间可通过 IP/主机名访问,无网络隔离。
2.2 集群搭建步骤
(1)初始化管理节点
在选定的主管理节点执行初始化命令,指定内网 IP 确保其他节点可访问:
bash
docker swarm init --advertise-addr 192.168.1.100
执行成功后会输出工作节点/管理节点的加入命令(含唯一令牌),需妥善保存。
(2)添加高可用管理节点
为避免单节点故障,需添加备用管理节点(总数保持奇数,推荐 3 个):
bash
# 1. 主管理节点生成加入令牌
docker swarm join-token manager
# 2. 备用管理节点执行生成的命令(示例)
docker swarm join --token SWMTKN-1-xxxx 192.168.1.100:2377
(3)添加工作节点
bash
# 1. 主管理节点生成工作节点令牌
docker swarm join-token worker
# 2. 所有工作节点执行生成的命令(示例)
docker swarm join --token SWMTKN-1-xxxx 192.168.1.100:2377
(4)验证集群状态
在任意管理节点执行命令查看节点列表:
bash
docker node ls
输出示例(3 管理节点 + 2 工作节点):
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
abc123... manager-1 Ready Active Leader 20.10.21
def456... manager-2 Ready Active Reachable 20.10.21
ghi789... manager-3 Ready Active Reachable 20.10.21
jkl012... worker-1 Ready Active None 20.10.21
mno345... worker-2 Ready Active None 20.10.21
Leader:当前主管理节点;Reachable:备用管理节点。
2.3 核心管理操作实战
(1)服务管理
bash
# 1. 创建 Nginx 服务(3 副本,端口映射 80:80)
docker service create --name nginx-service --replicas 3 -p 80:80 nginx:1.24
# 2. 查看服务列表
docker service ls
# 3. 查看服务详情(运行节点、任务状态)
docker service ps nginx-service
# 4. 扩缩容服务(调整至 5 副本)
docker service scale nginx-service=5
# 5. 升级服务镜像(1.24 → 1.25)
docker service update --image nginx:1.25 nginx-service
# 6. 删除服务
docker service rm nginx-service
(2)栈(Stack)部署多服务应用
创建 docker-compose.yml 文件(定义 Web + MySQL 组合):
yaml
version: "3.8"
services:
web:
image: nginx:1.24
ports:
- "80:80"
deploy:
replicas: 3
restart_policy:
condition: on-failure # 故障时自动重启
max_attempts: 3 # 最大重启次数
placement:
constraints: [node.role == worker] # 仅调度到工作节点
db:
image: mysql:8.0
environment:
- MYSQL_ROOT_PASSWORD=123456
volumes:
- db-data:/var/lib/mysql # 挂载持久化卷
deploy:
placement:
constraints: [node.labels.type == db-node] # 调度到带 db-node 标签的节点
volumes:
db-data: # 定义持久化卷
栈部署与管理命令:
bash
# 部署栈(myapp 为栈名,-c 指定 Compose 文件)
docker stack deploy -c docker-compose.yml myapp
# 查看栈中服务
docker stack services myapp
# 销毁栈(删除所有关联服务)
docker stack rm myapp
(3)节点与网络管理
bash
# 1. 给节点打标签(用于调度约束)
docker node update --label-add type=db-node worker-1
# 2. 禁止节点调度(维护前操作)
docker node update --availability drain worker-1
# 3. 恢复节点调度
docker node update --availability active worker-1
# 4. 创建 Overlay 网络(多服务通信)
docker network create --driver overlay my-overlay-network
# 5. 创建 NFS 网络卷(跨节点共享数据)
docker volume create --driver local \
--opt type=nfs \
--opt o=addr=192.168.1.200,rw \
--opt device=:/nfs/share \
my-nfs-volume
三、生产环境落地经验与思考
3.1 集群架构设计建议
结合电商后台服务(日均 PV 10 万+)落地案例,生产环境推荐架构:
| 组件 | 配置建议 | 部署要求 |
|---|---|---|
| 管理节点 | 3 台,2 核 4G | 分布在不同机柜,避免物理机故障 |
| 工作节点 | 4 核 8G 起步 | 分可用区部署(如机房 A 4 台 + 机房 B 4 台) |
| 网络 | 自定义 Overlay 网络 | 按业务隔离,外部流量通过 Nginx 接入 Ingress 网络 |
| 存储 | 核心数据:NFS/EFS;非核心数据:本地卷 | 核心数据保证一致性,非核心数据提升读写性能 |
3.2 高可用与稳定性保障
-
管理节点高可用:必须部署 3/5 个管理节点,Raft 协议要求多数节点在线才能正常提供服务;
-
服务重启策略 :所有服务配置重启规则,防止容器异常退出:
yamlrestart_policy: condition: on-failure max_attempts: 3 delay: 5s -
资源限制 :为每个服务设置 CPU/内存限制,避免耗尽节点资源:
yamldeploy: resources: limits: cpus: '0.5' # 最大 0.5 核 memory: 512M # 最大 512MB reservations: cpus: '0.2' # 预留 0.2 核 memory: 256M # 预留 256MB -
滚动更新与回滚 :升级时控制并行数和延迟,避免服务不可用:
bash# 滚动升级(每次更新 1 个副本,间隔 10 秒) docker service update --image nginx:1.25 --update-parallelism 1 --update-delay 10s nginx-service # 升级失败回滚 docker service rollback nginx-service
3.3 安全与配置管理
-
私有镜像仓库 :生产环境必须使用私有仓库(Harbor/AWS ECR),镜像打版本标签(禁止
latest); -
敏感信息管理 :使用 Docker Secret 存储密码/密钥,避免硬编码:
bash# 创建 Secret(从标准输入读取密码) echo "123456" | docker secret create mysql_root_pwd -在 Compose 文件中引用:
yamlservices: db: image: mysql:8.0 secrets: - mysql_root_pwd environment: - MYSQL_ROOT_PASSWORD_FILE=/run/secrets/mysql_root_pwd secrets: mysql_root_pwd: external: true
3.4 监控与故障排查
(1)监控工具选型
- 资源监控:Prometheus + Grafana(节点/容器 CPU、内存、磁盘);
- 日志收集:ELK 栈 / Sematext(实时分析容器日志)。
(2)常用排查命令
bash
# 实时查看服务日志
docker service logs -f nginx-service
# 查看节点资源使用情况
docker stats
# 查看集群详细信息
docker info
# 检查节点健康状态
docker node inspect --format '{{.Status}}' worker-1
3.5 选型场景思考
| 维度 | Docker Swarm | Kubernetes |
|---|---|---|
| 适合场景 | 中小规模集群(≤50 节点)、无状态服务、快速部署、运维人力有限 | 大规模集群(≥100 节点)、复杂有状态服务、高级调度需求 |
| 核心优势 | 轻量、易上手、Docker 原生集成 | 功能强大、生态丰富、社区成熟 |
| 学习/运维成本 | 低 | 高 |