Docker Swarm 集群部署與管理入門 2026

💡 什麼是 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 Swarm | Kubernetes |
|---|---|---|
| 複雜度 | 簡單易用 | 功能強大但複雜 |
| 學習曲線 | 平緩 | 陡峭 |
| 部署速度 | 快速 | 較慢 |
| 社區生態 | 較小 | 龐大 |
| 適用場景 | 中小型集群 | 大型企業級集群 |
| 內置負載均衡 | ✅ | 需要額外配置 |
| 自動故障恢復 | ✅ | ✅ |
二、集群初始化
2.1 初始化 Manager 節點
# 在第一個節點上初始化 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:23772.2 添加 Worker 節點
# 在 Worker 節點上執行(使用從 Manager 獲取的 token)
docker swarm join --token SWMTKN-1-xxx 192.168.1.100:2377
# 查看加入命令(在 Manager 上執行)
docker swarm join-token worker
# 查看節點列表
docker node ls2.3 添加 Manager 節點
# 獲取 Manager 加入 token
docker swarm join-token manager
# 在新節點上執行
docker swarm join --token SWMTKN-1-yyy 192.168.1.100:2377
# 驗證 Manager 狀態
docker node ls2.4 離開集群
# Worker 節點離開
docker swarm leave
# Manager 節點離開(需先降級)
docker node demote <node-name>
docker swarm leave
# 強制移除節點(在 Manager 上執行)
docker node rm <node-name> --force三、服務部署
3.1 創建服務
# 基本服務創建
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-image3.2 服務配置選項
# 資源限制
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 \
web3.3 Docker Compose 部署
# 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:# 使用 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 查看服務狀態
# 查看所有服務
docker service ls
# 查看服務詳情
docker service inspect <service-name>
# 查看服務日誌
docker service logs <service-name>
# 查看服務任務
docker service ps <service-name>4.2 擴展服務
# 擴展服務副本數
docker service scale web=5
# 縮小服務
docker service scale web=2
# 停止服務(保留配置)
docker service scale web=0
# 恢復服務
docker service scale web=34.3 更新服務
# 更新鏡像
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 web4.4 刪除服務
# 刪除單個服務
docker service rm web
# 刪除整個棧
docker stack rm my-stack五、負載均衡與服務發現
5.1 內置負載均衡
# 創建帶負載均衡的服務
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 服務發現
# 同一網絡內通過服務名訪問
docker exec -it <container> curl http://web:80
# DNS 解析服務
docker exec -it <container> nslookup web
# 使用 VIP(虛擬 IP)
docker service inspect web | grep VIP5.3 外部負載均衡
# 創建外部訪問的服務
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 配置滾動更新
# 創建服務時配置更新策略
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 web6.2 回滾服務
# 查看服務更新歷史
docker service inspect web | grep -A 20 "UpdateStatus"
# 回滾到上一個版本
docker service rollback web
# 回滾指定服務
docker service rollback --to-revision 2 web6.3 更新策略配置
| 參數 | 說明 | 默認值 |
|---|---|---|
--update-parallelism | 並行更新的任務數 | 1 |
--update-delay | 更新間隔時間 | 0s |
--update-failure-action | 更新失敗時的動作 | pause |
--update-monitor | 更新後監控時間 | 5s |
--update-order | 更新順序 | stop-first |
七、故障恢復與高可用性
7.1 節點故障處理
# 查看節點狀態
docker node ls
# 標記節點為不可用
docker node update --availability drain <node-name>
# 恢復節點
docker node update --availability active <node-name>
# 查看任務重新調度
docker service ps web7.2 自動故障恢復
# 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 高可用性
# 推薦配置奇數個 Manager 節點(3 或 5 個)
# Raft 協議需要多數派才能選舉 Leader
# 查看 Manager 狀態
docker node inspect <manager-node> | grep -A 5 "ManagerStatus"
# 手動觸發 Leader 選舉(不推薦在生產環境使用)
docker swarm update --autorebalance八、節點標籤與約束
8.1 設置節點標籤
# 設置節點標籤
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 使用約束部署
# 使用約束部署服務
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.08.3 Docker Compose 約束配置
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 網絡
# 創建 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-network9.2 服務網絡配置
# 服務使用 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 監控集群狀態
# 查看節點狀態
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 監控
# 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 日誌收集
# 使用 ELK 棧收集日誌
docker service create \
--name logstash \
--log-driver gelf \
--log-opt gelf-address=udp://logstash:12201 \
nginx十一、備份與恢復
11.1 備份 Swarm 配置
# 導出 Swarm 配置
docker swarm inspect > swarm-config.json
# 備份 Raft 日誌(需要停止 Docker)
cp -r /var/lib/docker/swarm /backup/swarm11.2 恢復 Swarm 配置
# 停止 Docker
systemctl stop docker
# 恢復 Raft 日誌
cp -r /backup/swarm /var/lib/docker/swarm
# 啟動 Docker
systemctl start docker
# 檢查恢復狀態
docker node ls十二、Swarm 最佳實踐
12.1 集群規劃
# Manager 節點數量:3 或 5 個(奇數)
# Worker 節點數量:根據負載決定
# 節點分佈:跨可用區部署
# 推薦配置
# Production: 3 Managers + N Workers
# Staging: 1 Manager + 2 Workers
# Development: 1 Manager (單節點模式)12.2 安全配置
# 啟用 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-network12.3 性能優化
# 調整調度器配置
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 是一個輕量級、易於上手的容器編排工具,非常適合中小型集群部署。通過本文的學習,你已經掌握了:
- 集群初始化:Manager 和 Worker 節點配置
- 服務部署:創建、配置、擴展服務
- 負載均衡:內置負載均衡和服務發現
- 滾動更新:安全的版本升級和回滾
- 故障恢復:高可用性配置和自動恢復
- 節點管理:標籤、約束、資源限制
推薦閱讀:
🚀 提示: 在生產環境中,建議使用至少 3 個 Manager 節點來保證高可用性,並定期備份 Swarm 配置。同時,結合監控工具實時追蹤集群狀態。
延伸阅读
免责声明
本文仅供技术交流和学习参考。涉及第三方服务的链接可能包含 sponsored 标记,请自行核实服务条款、价格和可用性,并遵守当地法律法规。