跳轉到內容

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 标记,请自行核实服务条款、价格和可用性,并遵守当地法律法规。

最後更新於: