Docker Swarm 叢集部署與管理

Swarm 簡介

Docker Swarm 是 Docker 原生的容器編排工具,它能夠將多個 Docker 主機整合成一個虛擬的 Docker 主機,讓您可以輕鬆地管理和部署容器化應用程式。

主要特點

  • 原生整合:Swarm 直接內建於 Docker Engine,無需安裝額外軟體
  • 去中心化設計:支援多個 Manager 節點,確保高可用性
  • 宣告式服務模型:定義期望狀態,Swarm 自動維護
  • 服務發現:內建 DNS 服務,自動處理服務間的連接
  • 負載平衡:自動分散請求至各個容器實例
  • 滾動更新:支援零停機時間的服務更新

架構概念

Swarm 叢集由兩種類型的節點組成:

  • Manager 節點:負責叢集管理、任務調度和維護叢集狀態
  • Worker 節點:執行由 Manager 分配的容器任務

初始化叢集

建立 Manager 節點

在第一台主機上初始化 Swarm 叢集:

1
2
3
4
5
# 初始化 Swarm,指定廣播地址
docker swarm init --advertise-addr 192.168.1.100

# 執行後會顯示加入叢集的命令,類似如下:
# docker swarm join --token SWMTKN-1-xxx 192.168.1.100:2377

加入 Worker 節點

在其他主機上執行加入命令:

1
2
# 使用 init 時產生的 token 加入叢集
docker swarm join --token SWMTKN-1-xxx 192.168.1.100:2377

查看叢集狀態

1
2
3
4
5
6
7
8
9
# 列出所有節點
docker node ls

# 查看節點詳細資訊
docker node inspect <node-id>

# 取得加入 token
docker swarm join-token worker   # Worker 節點 token
docker swarm join-token manager  # Manager 節點 token

節點管理

1
2
3
4
5
6
7
8
# 將節點提升為 Manager
docker node promote <node-name>

# 將 Manager 降級為 Worker
docker node demote <node-name>

# 移除節點(需先在該節點上執行 docker swarm leave)
docker node rm <node-name>

部署服務

建立服務

使用 docker service create 命令部署服務:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 建立基本服務
docker service create --name web nginx:latest

# 建立具有多個副本的服務
docker service create --name web --replicas 3 nginx:latest

# 指定連接埠對應
docker service create --name web --publish 8080:80 nginx:latest

# 設定環境變數
docker service create --name db \
  --env MYSQL_ROOT_PASSWORD=secret \
  --env MYSQL_DATABASE=myapp \
  mysql:8.0

使用 Stack 部署

透過 Docker Compose 檔案部署完整應用程式堆疊:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# docker-stack.yml
version: '3.8'

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    deploy:
      replicas: 3
      update_config:
        parallelism: 1
        delay: 10s
      restart_policy:
        condition: on-failure

  api:
    image: myapp/api:latest
    deploy:
      replicas: 2
    environment:
      - DATABASE_URL=postgres://db:5432/myapp

  db:
    image: postgres:15
    volumes:
      - db-data:/var/lib/postgresql/data
    deploy:
      placement:
        constraints:
          - node.role == manager

volumes:
  db-data:

部署 Stack:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 部署應用程式堆疊
docker stack deploy -c docker-stack.yml myapp

# 列出所有 Stack
docker stack ls

# 查看 Stack 中的服務
docker stack services myapp

# 移除 Stack
docker stack rm myapp

服務管理

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 列出所有服務
docker service ls

# 查看服務詳細資訊
docker service inspect web

# 查看服務日誌
docker service logs web

# 查看服務任務分佈
docker service ps web

擴展與更新

水平擴展

調整服務副本數量:

1
2
3
4
5
6
7
8
# 擴展服務至 5 個副本
docker service scale web=5

# 同時擴展多個服務
docker service scale web=5 api=3

# 使用 update 命令調整副本數
docker service update --replicas 10 web

滾動更新

執行零停機時間的服務更新:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 更新服務映像檔
docker service update --image nginx:1.25 web

# 設定更新策略
docker service update \
  --update-parallelism 2 \
  --update-delay 10s \
  --update-failure-action rollback \
  web

# 回滾到前一個版本
docker service rollback web

資源限制

設定服務的資源使用上限:

1
2
3
4
5
6
7
# 設定 CPU 和記憶體限制
docker service update \
  --limit-cpu 0.5 \
  --limit-memory 512M \
  --reserve-cpu 0.25 \
  --reserve-memory 256M \
  web

健康檢查

配置容器健康檢查:

1
2
3
4
5
6
docker service create --name web \
  --health-cmd "curl -f http://localhost/ || exit 1" \
  --health-interval 30s \
  --health-timeout 10s \
  --health-retries 3 \
  nginx:latest

網路與儲存

Overlay 網路

建立跨節點的 Overlay 網路:

1
2
3
4
5
6
7
8
# 建立 Overlay 網路
docker network create --driver overlay --attachable mynetwork

# 將服務連接到網路
docker service create --name web --network mynetwork nginx:latest

# 建立加密的 Overlay 網路
docker network create --driver overlay --opt encrypted mynetwork-secure

Ingress 網路

Swarm 自動建立 ingress 網路,提供服務的外部訪問和負載平衡:

1
2
3
4
5
6
7
8
9
# 發布服務連接埠(使用 ingress 模式)
docker service create --name web \
  --publish mode=ingress,target=80,published=8080 \
  nginx:latest

# 使用 host 模式直接綁定主機連接埠
docker service create --name web \
  --publish mode=host,target=80,published=8080 \
  nginx:latest

持久化儲存

使用 Volume 進行資料持久化:

1
2
3
4
5
6
7
8
9
# 建立具有 Volume 的服務
docker service create --name db \
  --mount type=volume,source=db-data,target=/var/lib/mysql \
  mysql:8.0

# 使用 NFS 掛載
docker service create --name web \
  --mount type=volume,source=shared-data,target=/data,volume-driver=local,volume-opt=type=nfs,volume-opt=device=:/path,volume-opt=o=addr=192.168.1.50 \
  nginx:latest

配置與密鑰

安全地管理應用程式配置:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# 建立配置
echo "server { listen 80; }" | docker config create nginx-config -

# 在服務中使用配置
docker service create --name web \
  --config source=nginx-config,target=/etc/nginx/conf.d/default.conf \
  nginx:latest

# 建立密鑰
echo "my-secret-password" | docker secret create db-password -

# 在服務中使用密鑰
docker service create --name db \
  --secret db-password \
  --env MYSQL_ROOT_PASSWORD_FILE=/run/secrets/db-password \
  mysql:8.0

總結

Docker Swarm 提供了一個簡單且強大的容器編排解決方案,適合中小型專案或剛開始接觸容器編排的團隊。其主要優勢在於:

  1. 易於上手:無需額外安裝,直接使用 Docker 命令
  2. 原生整合:與 Docker Compose 格式相容
  3. 高可用性:支援多 Manager 節點架構
  4. 安全性:內建 TLS 加密和密鑰管理

透過本文介紹的基礎操作,您可以快速建立一個 Docker Swarm 叢集,並開始部署和管理您的容器化應用程式。

comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy