跳轉至

建立 2025-08-18 更新 2026-09-28

Docker Swarm

Docker Swarm 可以把好幾台裝了 Docker 的電腦連在一起,當成一台來使用。你只要告訴它「這個網站要跑 3 份」,Swarm 就會自動把它們分配到各台電腦;其中一台壞掉時,也會自動在其他電腦補上。這種管理多台主機上容器的工作,叫做「容器編排」(orchestration)。Swarm 內建在 Docker 裡,設定檔沿用 Compose 的格式,是學習容器編排最容易上手的方式。

Swarm 還有人在用嗎?

很早以前有一個獨立安裝的舊版 Swarm,已經停止維護。本頁介紹的是內建在 Docker 裡的 Swarm mode,目前仍持續維護,適合小型叢集。

Swarm 和 Kubernetes 怎麼選?

Docker Swarm Kubernetes
安裝 Docker 內建,一個指令啟用 需要另外安裝,元件較多
設定檔 和 Compose 幾乎一樣 自己的一套格式
學習難度 低 高
適合 幾台主機的小型系統 大型、雲端系統

建議先用 Swarm 理解「服務、副本、滾動更新」這些觀念,之後要學 Kubernetes 會容易很多。

幾個新名詞

  • 節點(node):加入 Swarm 的每一台電腦。
    • manager:負責管理,決定容器要放在哪台電腦。
    • worker:負責執行容器。manager 預設也會執行容器。
  • 服務(service):你希望達到的狀態,例如「用 nginx 跑 3 份,開放 80 埠」。
  • 副本(replica):服務的其中一份,也就是一個容器。
  • Stack:用一份 Compose 檔部署的一整組服務。

如何建立 Swarm?

準備兩台以上能互相連線的電腦(虛擬機也可以;想免安裝體驗,可以用 Play with Docker)。

第一步:在第一台電腦啟用 Swarm,它會成為 manager:

docker swarm init --advertise-addr <這台電腦的IP>

執行後會印出一行 docker swarm join --token ... 的指令,把它複製起來。

第二步:在其他電腦貼上剛才那行指令,加入成為 worker:

docker swarm join --token <token> <manager的IP>:2377

忘記指令的話,在 manager 執行 docker swarm join-token worker 可以再看一次。

第三步:回到 manager 確認:

docker node ls

看到所有電腦都顯示 Ready 就完成了。

防火牆要開放的連接埠

電腦之間要能透過 TCP 2377、TCP/UDP 7946、UDP 4789 互相連線,Swarm 才能正常運作。

建立與管理服務

以下指令都在 manager 上執行。

# 建立服務:用 nginx 跑 3 份,開放 80 埠
docker service create --name web --replicas 3 -p 80:80 nginx:1.28

# 查看服務
docker service ls
docker service ps web     # 看每一份跑在哪台電腦

調整數量

docker service scale web=5

Swarm 會自動多開 2 個容器,分配到各台電腦。

更新版本

docker service update --image nginx:1.29 web

Swarm 會一個一個替換成新版本,不會同時全部停掉,所以網站不會中斷,這叫做「滾動更新」。如果新版本有問題,可以退回上一版:

docker service rollback web

連到任何一台都可以

Swarm 有一個方便的功能:不管你連到叢集裡的哪一台電腦的 80 埠,都能連到 web 服務,即使那台電腦上沒有跑 web 的容器。Swarm 會自動把連線轉給有執行的電腦。

用 Compose 檔部署

Swarm 可以直接使用 Compose 檔,只要多加一段 deploy 設定:

services:
  web:
    image: nginx:1.28
    ports:
      - "80:80"
    deploy:
      replicas: 3               # 跑 3 份
      update_config:
        parallelism: 1          # 更新時一次換 1 個
        delay: 10s              # 每換一個等 10 秒
      restart_policy:
        condition: on-failure   # 當掉時自動重啟

部署與移除:

docker stack deploy -c compose.yaml mysite   # 部署,mysite 是 Stack 名稱
docker stack services mysite                 # 查看
docker stack rm mysite                       # 移除

Swarm 不會幫你建置 Image

Swarm 會忽略 Compose 檔裡的 build。Image 要先建置好並上傳到倉庫(例如 Docker Hub),讓每一台電腦都能下載。

安全地存放密碼:Secrets

Swarm 提供 Secrets 功能保存密碼。密碼會加密儲存,只交給需要的服務,在容器裡以檔案的形式出現在 /run/secrets/密碼名稱:

# 建立一個叫 db_password 的 secret
printf "我的密碼" | docker secret create db_password -

# 建立服務時指定要使用這個 secret
docker service create --name db \
  --secret db_password \
  -e POSTGRES_PASSWORD_FILE=/run/secrets/db_password \
  postgres:17

POSTGRES_PASSWORD_FILE 是 Postgres Image 支援的設定,會從檔案讀取密碼。

用網頁管理

Portainer 也支援 Swarm,可以在網頁上查看各台電腦、服務與 Stack 的狀態。

參考資料

推薦影音

Docker Swarm Mode: EASY Tutorial

簡述:實際建立 Swarm 叢集、用 Compose 檔部署服務,並示範 Secrets 等功能,涵蓋本頁大部分內容。(Christian Lempa)

更多影片請見 影音教學。