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 提供了一個簡單且強大的容器編排解決方案,適合中小型專案或剛開始接觸容器編排的團隊。其主要優勢在於:
- 易於上手:無需額外安裝,直接使用 Docker 命令
- 原生整合:與 Docker Compose 格式相容
- 高可用性:支援多 Manager 節點架構
- 安全性:內建 TLS 加密和密鑰管理
透過本文介紹的基礎操作,您可以快速建立一個 Docker Swarm 叢集,並開始部署和管理您的容器化應用程式。