跳转到内容

Docker Swarm 集群部署与管理入门 2026

Docker Swarm 集群部署

💡 什么是 Docker Swarm? Docker Swarm 是 Docker 官方提供的容器编排工具,用于将多个 Docker 主机组成一个集群,实现容器的自动化部署、扩展和管理。

本文将带你从 0 到 1 掌握:

  • ✅ Swarm 集群架构与概念
  • ✅ 集群初始化与节点管理
  • ✅ 服务部署与配置
  • ✅ 负载均衡与服务发现
  • ✅ 滚动更新与回滚
  • ✅ 故障恢复与高可用性

一、Swarm 集群基础

1.1 Swarm 架构概述

┌─────────────────────────────────────────────────────────────────┐
│                      Docker Swarm Cluster                      │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  ┌─────────────────────────────────────────────────────────┐   │
│  │                    Manager Node(s)                      │   │
│  │  ┌──────────┐  ┌──────────┐  ┌──────────┐            │   │
│  │  │ Manager1 │  │ Manager2 │  │ Manager3 │            │   │
│  │  │ (Leader) │  │ (Raft)   │  │ (Raft)   │            │   │
│  │  └────┬─────┘  └────┬─────┘  └────┬─────┘            │   │
│  │       │            │            │                      │   │
│  └───────┼────────────┼────────────┼──────────────────────┘   │
│          │            │            │                           │
│          ▼            ▼            ▼                           │
│  ┌─────────────────────────────────────────────────────────┐   │
│  │                    Worker Nodes                         │   │
│  │  ┌──────────┐  ┌──────────┐  ┌──────────┐  ┌────────┐ │   │
│  │  │ Worker1  │  │ Worker2  │  │ Worker3  │  │Worker4 │ │   │
│  │  │ Container │  │ Container│  │ Container│  │Container││   │
│  │  │ Container │  │ Container│  │ Container│  │Container││   │
│  │  └──────────┘  └──────────┘  └──────────┘  └────────┘ │   │
│  └─────────────────────────────────────────────────────────┘   │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

1.2 核心概念

概念说明
Manager Node管理节点,负责集群管理、调度决策、服务编排
Worker Node工作节点,负责运行容器任务
Leader主管理节点,由 Raft 协议选举产生
Service定义要运行的任务(容器)的规范
Task单个容器实例,是 Swarm 的最小调度单位
Slot任务槽位,每个节点有有限数量的槽位
Overlay Network跨主机网络,实现容器间通信

1.3 Swarm vs Kubernetes

特性Docker SwarmKubernetes
复杂度简单易用功能强大但复杂
学习曲线平缓陡峭
部署速度快速较慢
社区生态较小庞大
适用场景中小型集群大型企业级集群
内置负载均衡需要额外配置
自动故障恢复

二、集群初始化

2.1 初始化 Manager 节点

bash
# 在第一个节点上初始化 Swarm
docker swarm init --advertise-addr <manager-ip>

# 示例
docker swarm init --advertise-addr 192.168.1.100

# 查看初始化信息
docker swarm init --advertise-addr 192.168.1.100
# 输出示例:
# Swarm initialized: current node (abc123) is now a manager.
# 
# To add a worker to this swarm, run the following command:
#     docker swarm join --token SWMTKN-1-xxx 192.168.1.100:2377
# 
# To add a manager to this swarm, run:
#     docker swarm join-token manager
#     docker swarm join --token SWMTKN-1-yyy 192.168.1.100:2377

2.2 添加 Worker 节点

bash
# 在 Worker 节点上执行(使用从 Manager 获取的 token)
docker swarm join --token SWMTKN-1-xxx 192.168.1.100:2377

# 查看加入命令(在 Manager 上执行)
docker swarm join-token worker

# 查看节点列表
docker node ls

2.3 添加 Manager 节点

bash
# 获取 Manager 加入 token
docker swarm join-token manager

# 在新节点上执行
docker swarm join --token SWMTKN-1-yyy 192.168.1.100:2377

# 验证 Manager 状态
docker node ls

2.4 离开集群

bash
# Worker 节点离开
docker swarm leave

# Manager 节点离开(需先降级)
docker node demote <node-name>
docker swarm leave

# 强制移除节点(在 Manager 上执行)
docker node rm <node-name> --force

三、服务部署

3.1 创建服务

bash
# 基本服务创建
docker service create \
  --name web \
  --replicas 3 \
  nginx

# 指定端口映射
docker service create \
  --name web \
  --replicas 3 \
  --publish 80:80 \
  nginx

# 指定网络
docker service create \
  --name web \
  --replicas 3 \
  --network my-overlay-network \
  nginx

# 指定环境变量
docker service create \
  --name api \
  --replicas 2 \
  --env NODE_ENV=production \
  --env DATABASE_URL=postgres://db:5432/mydb \
  my-api-image

3.2 服务配置选项

bash
# 资源限制
docker service create \
  --name web \
  --replicas 3 \
  --limit-cpu 0.5 \
  --limit-memory 512M \
  --reserve-cpu 0.25 \
  --reserve-memory 256M \
  nginx

# 健康检查
docker service create \
  --name web \
  --replicas 3 \
  --health-cmd "curl -f http://localhost/health || exit 1" \
  --health-interval 30s \
  --health-timeout 10s \
  --health-retries 3 \
  nginx

# 更新配置
docker service update \
  --replicas 5 \
  --limit-memory 1G \
  web

3.3 Docker Compose 部署

yaml
# docker-compose.yml
version: '3.8'

services:
  web:
    image: nginx
    deploy:
      replicas: 3
      resources:
        limits:
          cpus: '0.5'
          memory: 512M
        reservations:
          cpus: '0.25'
          memory: 256M
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3
        window: 120s
      update_config:
        parallelism: 1
        delay: 10s
        failure_action: rollback
      placement:
        constraints:
          - node.role == worker
          - node.labels.region == us-west
    ports:
      - "80:80"
    networks:
      - my-overlay-network

  db:
    image: mysql:8.0
    deploy:
      replicas: 1
      placement:
        constraints:
          - node.role == worker
          - node.labels.type == database
    environment:
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: mydb
    volumes:
      - db-data:/var/lib/mysql

networks:
  my-overlay-network:
    driver: overlay

volumes:
  db-data:
bash
# 使用 Compose 文件部署
docker stack deploy --compose-file docker-compose.yml my-stack

# 查看栈状态
docker stack ls
docker stack services my-stack
docker stack ps my-stack

四、服务管理

4.1 查看服务状态

bash
# 查看所有服务
docker service ls

# 查看服务详情
docker service inspect <service-name>

# 查看服务日志
docker service logs <service-name>

# 查看服务任务
docker service ps <service-name>

4.2 扩展服务

bash
# 扩展服务副本数
docker service scale web=5

# 缩小服务
docker service scale web=2

# 停止服务(保留配置)
docker service scale web=0

# 恢复服务
docker service scale web=3

4.3 更新服务

bash
# 更新镜像
docker service update --image nginx:latest web

# 更新端口映射
docker service update --publish-rm 80:80 --publish-add 8080:80 web

# 更新资源限制
docker service update --limit-memory 1G web

# 强制更新(重新部署所有任务)
docker service update --force web

4.4 删除服务

bash
# 删除单个服务
docker service rm web

# 删除整个栈
docker stack rm my-stack

五、负载均衡与服务发现

5.1 内置负载均衡

bash
# 创建带负载均衡的服务
docker service create \
  --name web \
  --replicas 5 \
  --publish published=80,target=80,mode=host \
  nginx

# 查看端口映射
docker service inspect web | grep -A 10 "Ports"

5.2 服务发现

bash
# 同一网络内通过服务名访问
docker exec -it <container> curl http://web:80

# DNS 解析服务
docker exec -it <container> nslookup web

# 使用 VIP(虚拟 IP)
docker service inspect web | grep VIP

5.3 外部负载均衡

bash
# 创建外部访问的服务
docker service create \
  --name web \
  --replicas 3 \
  --publish 80:80 \
  --publish 443:443 \
  nginx

# 配置 Nginx 作为外部负载均衡器
# /etc/nginx/conf.d/swarm.conf
upstream swarm_web {
    server 192.168.1.100:80;
    server 192.168.1.101:80;
    server 192.168.1.102:80;
}

server {
    listen 80;
    server_name example.com;
    
    location / {
        proxy_pass http://swarm_web;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

六、滚动更新与回滚

6.1 配置滚动更新

bash
# 创建服务时配置更新策略
docker service create \
  --name web \
  --replicas 5 \
  --update-parallelism 2 \
  --update-delay 10s \
  --update-failure-action rollback \
  --update-monitor 60s \
  nginx:1.24

# 更新服务
docker service update --image nginx:1.25 web

# 查看更新进度
docker service ps web

6.2 回滚服务

bash
# 查看服务更新历史
docker service inspect web | grep -A 20 "UpdateStatus"

# 回滚到上一个版本
docker service rollback web

# 回滚指定服务
docker service rollback --to-revision 2 web

6.3 更新策略配置

参数说明默认值
--update-parallelism并行更新的任务数1
--update-delay更新间隔时间0s
--update-failure-action更新失败时的动作pause
--update-monitor更新后监控时间5s
--update-order更新顺序stop-first

七、故障恢复与高可用性

7.1 节点故障处理

bash
# 查看节点状态
docker node ls

# 标记节点为不可用
docker node update --availability drain <node-name>

# 恢复节点
docker node update --availability active <node-name>

# 查看任务重新调度
docker service ps web

7.2 自动故障恢复

yaml
# docker-compose.yml
services:
  web:
    image: nginx
    deploy:
      replicas: 3
      restart_policy:
        condition: on-failure  # on-failure, any, none
        delay: 5s              # 重试间隔
        max_attempts: 3        # 最大重试次数
        window: 120s           # 评估窗口

7.3 Manager 高可用性

bash
# 推荐配置奇数个 Manager 节点(3 或 5 个)
# Raft 协议需要多数派才能选举 Leader

# 查看 Manager 状态
docker node inspect <manager-node> | grep -A 5 "ManagerStatus"

# 手动触发 Leader 选举(不推荐在生产环境使用)
docker swarm update --autorebalance

八、节点标签与约束

8.1 设置节点标签

bash
# 设置节点标签
docker node update --label-add region=us-west <node-name>
docker node update --label-add type=database <node-name>
docker node update --label-add gpu=true <node-name>

# 查看节点标签
docker node inspect <node-name> | grep Labels

# 删除节点标签
docker node update --label-rm gpu <node-name>

8.2 使用约束部署

bash
# 使用约束部署服务
docker service create \
  --name web \
  --replicas 3 \
  --constraint "node.role == worker" \
  --constraint "node.labels.region == us-west" \
  nginx

# 多约束条件
docker service create \
  --name db \
  --replicas 1 \
  --constraint "node.labels.type == database" \
  --constraint "node.labels.region == us-east" \
  mysql:8.0

8.3 Docker Compose 约束配置

yaml
version: '3.8'
services:
  web:
    image: nginx
    deploy:
      placement:
        constraints:
          - node.role == worker
          - node.labels.region == us-west
          - node.labels.availability == high

  db:
    image: mysql:8.0
    deploy:
      placement:
        constraints:
          - node.labels.type == database
        preferences:
          - spread: node.labels.zone

九、网络配置

9.1 创建 Overlay 网络

bash
# 创建 overlay 网络
docker network create \
  --driver overlay \
  --subnet 10.0.0.0/24 \
  --attachable \
  my-overlay-network

# 创建加密 overlay 网络
docker network create \
  --driver overlay \
  --encrypt \
  secure-network

# 查看网络
docker network ls
docker network inspect my-overlay-network

9.2 服务网络配置

bash
# 服务使用 overlay 网络
docker service create \
  --name web \
  --replicas 3 \
  --network my-overlay-network \
  nginx

# 服务连接多个网络
docker service create \
  --name api \
  --replicas 2 \
  --network frontend \
  --network backend \
  my-api

十、监控与日志

10.1 监控集群状态

bash
# 查看节点状态
docker node ls

# 查看服务状态
docker service ls

# 查看任务状态
docker service ps <service-name>

# 查看容器日志
docker service logs <service-name>

# 实时日志
docker service logs -f <service-name>

10.2 使用 Prometheus 监控

yaml
# docker-compose.yml
services:
  prometheus:
    image: prom/prometheus
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
    ports:
      - "9090:9090"
    deploy:
      placement:
        constraints:
          - node.role == manager

  grafana:
    image: grafana/grafana
    ports:
      - "3000:3000"
    volumes:
      - grafana-data:/var/lib/grafana
    deploy:
      placement:
        constraints:
          - node.role == manager

volumes:
  grafana-data:

10.3 日志收集

bash
# 使用 ELK 栈收集日志
docker service create \
  --name logstash \
  --log-driver gelf \
  --log-opt gelf-address=udp://logstash:12201 \
  nginx

十一、备份与恢复

11.1 备份 Swarm 配置

bash
# 导出 Swarm 配置
docker swarm inspect > swarm-config.json

# 备份 Raft 日志(需要停止 Docker)
cp -r /var/lib/docker/swarm /backup/swarm

11.2 恢复 Swarm 配置

bash
# 停止 Docker
systemctl stop docker

# 恢复 Raft 日志
cp -r /backup/swarm /var/lib/docker/swarm

# 启动 Docker
systemctl start docker

# 检查恢复状态
docker node ls

十二、Swarm 最佳实践

12.1 集群规划

bash
# Manager 节点数量:3 或 5 个(奇数)
# Worker 节点数量:根据负载决定
# 节点分布:跨可用区部署

# 推荐配置
# Production: 3 Managers + N Workers
# Staging: 1 Manager + 2 Workers
# Development: 1 Manager (单节点模式)

12.2 安全配置

bash
# 启用 TLS
docker swarm init --advertise-addr <ip> --tlsverify

# 使用自定义 CA
docker swarm init \
  --advertise-addr <ip> \
  --external-ca \
  --ca-cert /path/to/ca.pem \
  --ca-key /path/to/ca-key.pem

# 限制网络访问
docker network create \
  --driver overlay \
  --internal \
  backend-network

12.3 性能优化

bash
# 调整调度器配置
docker swarm update \
  --task-history-limit 5 \
  --autorebalance

# 节点资源预留
docker node update \
  --availability active \
  --label-add reserved=true \
  manager-node

# 使用本地卷
docker service create \
  --name app \
  --mount type=volume,src=app-data,dst=/app/data \
  my-app

结语

Docker Swarm 是一个轻量级、易于上手的容器编排工具,非常适合中小型集群部署。通过本文的学习,你已经掌握了:

  1. 集群初始化:Manager 和 Worker 节点配置
  2. 服务部署:创建、配置、扩展服务
  3. 负载均衡:内置负载均衡和服务发现
  4. 滚动更新:安全的版本升级和回滚
  5. 故障恢复:高可用性配置和自动恢复
  6. 节点管理:标签、约束、资源限制

推荐阅读:


🚀 提示: 在生产环境中,建议使用至少 3 个 Manager 节点来保证高可用性,并定期备份 Swarm 配置。同时,结合监控工具实时追踪集群状态。


延伸阅读

免责声明

本文仅供技术交流和学习参考。涉及第三方服务的链接可能包含 sponsored 标记,请自行核实服务条款、价格和可用性,并遵守当地法律法规。