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 join --token ... 的指令,把它複製起來。
第二步:在其他電腦貼上剛才那行指令,加入成為 worker:
忘記指令的話,在 manager 執行 docker swarm join-token worker 可以再看一次。
第三步:回到 manager 確認:
看到所有電腦都顯示 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 # 看每一份跑在哪台電腦
調整數量
Swarm 會自動多開 2 個容器,分配到各台電腦。
更新版本
Swarm 會一個一個替換成新版本,不會同時全部停掉,所以網站不會中斷,這叫做「滾動更新」。如果新版本有問題,可以退回上一版:
連到任何一台都可以
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)
更多影片請見 影音教學。