顯示頁面舊版反向連結Fold/unfold all回到頁頂 本頁是唯讀的,您可以看到原始碼,但不能更動它。您如果覺得它不應被鎖上,請詢問管理員。 ====== Docker Swarm (Docker 多主機方案) ====== * 因進入 Kubernetes 的學習門檻高, 以及需要較高規格的硬體資源議題, 因此快速安裝測試 Docker Swarm 方案. ===== 安裝與部署 ===== - 確保每一台已經安裝好 docker 環境且每台之間都可以透過 TCP port 2377 互相溝通 - 選定一台當主控點 Exp. 192.168.11.186 - 登入到 192.168.11.186 - 執行初始化指令 <cli>docker swarm init --advertise-addr 192.168.11.186</cli> - 將回應的訊息記錄下來 Exp.<cli>docker swarm join --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk7434l103e8k2d6x 192.168.11.186:2377</cli> - 將三台 docker 環境加入成為 swarm 的 Worker Exp. 192.168.11.182, 192.168.11.237, 192.168.11.195 - 登入到 192.168.11.182, 192.168.11.237, 192.168.11.195 - 貼上並執行加入指令 (請使用您自己產生的 Token 和 IP) <cli>docker swarm join --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk7434l103e8k2d6x 192.168.11.186:2377</cli> - 回到主控點上 Exp. 192.168.11.186 查看狀態<cli>docker node ls</cli> <note tip>**如果忘記加入 Swarm 的語法** * 到主控點執行 - 取得加入成為 Manager 語法 : <cli>docker swarm join-token manager</cli> - 取得加入成為 Worker 語法 : <cli>docker swarm join-token worker</cli> </note> ===== 使用 portainer 進行 Web 統一控管 ===== * 在主控點安裝 Portainer (參考 [[tech/portainer]]) * 系統管理權限登入 Portainer UI -> Home -> Environment-related -> Environments -> Add environment \\ {{:tech:螢幕擷取畫面_2025-09-23_154130.png?1024|}} * 在主控點安裝 Agent (直接貼上這段即可) \\ {{:tech:螢幕擷取畫面_2025-09-23_154335.png?1024|}} * 當 Agent 安裝成功後, 回到 WebUI 輸入主控點的 Name (Exp. Portainer-186) 與 address (Exp. 192.168.1.186:9001), 然後點下 Connect 按鈕就可以建立完成 * 回到 Home 在 Environments 清單就可以看到 Portainer-186 , 點下去就可以開始管理這個 Swarm cluster \\ {{:tech:螢幕擷取畫面_2025-09-23_155253.png?1024|}} * 當每台 swarm node 重新啟動後 Portainer 管理介面點選出現 Failure Unable to retrieve system info: Unable to find an agent on any manager node 這異常訊息時, 可以重啟所有的 Portainer Agent 來解決<cli> portainer-161:~# docker service update --force portainer_agent portainer_agent overall progress: 1 out of 1 tasks aeaia7g7xz3w: running [==================================================>] verify: Service portainer_agent converged </cli> ===== 建立 shepherd 統一在主控點進行管理 ===== * stack yaml <file> services: shepherd: image: containrrr/shepherd:latest deploy: mode: replicated replicas: 1 placement: constraints: - node.role == manager restart_policy: condition: on-failure delay: 10s max_attempts: 3 environment: - TZ=Asia/Taipei - SLEEP_TIME=8h # 每8小時檢查一次,減少速率限制觸發(Go Duration 格式) # - WITH_REGISTRY_AUTH=true # 啟用註冊庫驗證 # - REGISTRY_USER_FILE=/run/secrets/dockerhub_user # - REGISTRY_PASSWORD_FILE=/run/secrets/dockerhub_token - ROLLBACK_ON_FAILURE=true # 更新失敗時自動回滾 - UPDATE_OPTIONS=--update-delay=1m --update-parallelism=1 --update-failure-action=rollback # 添加延遲和並行限制,避免順序錯誤 - IGNORELIST_SERVICES=cleanup-scheduler_cleanup-scheduler - NO_PROXY=localhost,127.0.0.1,/var/run/docker.sock volumes: - type: bind source: /var/run/docker.sock target: /var/run/docker.sock </file> ===== FAQ ===== ==== 1. 移除特定 Worker host 方式 Exp. immich-237 ==== * 進入主控點主機執行 - 將 immich-237 設為 drain (暫停提供服務) <cli>docker node update --availability drain immich-237</cli> - 確認 immich-237 的 AVAILABILITY 已經由 Active -> Drain , STATUS 已經由 Ready -> Down <cli>docker node ls</cli> - 移除 immich-237 這 Worker host <cli>docker node rm immich-237</cli> * 進入要移除的 Worker 執行 (immich-237) * 執行離開 swarm 指令<cli>docker swarm leave</cli> ==== 2. 建立擴充至三台當主控點 ==== * 將叢集中一台已經是工作節點 (Worker) 的主機,提升 (Promote) 為主控點。 * 確保您現有的 Swarm 叢集運作正常,主控點處於 Ready 狀態。 * 奇數原則:為了維持 Quorum 機制的穩定性,強烈建議主控點的總數為奇數(例如 3、5、7...)。如果您目前只有 1 台,那麼增加 2 台湊成 3 台是最好的做法。如果您目前已有 2 台,建議再增加 1 台湊成 3 台。 * 至現有的主控點執行 - 列出目前 Worker 清單<cli>docker node ls</cli><cli> portainer-186:~# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION ramtv89mfx2vcrekm7lsoobt8 moon-tv-195 Ready Active 28.3.3 318i734m5zx0w6iqe1q2ddijm * portainer-186 Ready Active Leader 28.3.3 i9zyahgszt2awip7dl1tckyz8 sbom-182 Ready Active 28.3.3 lxftp7j4emal33f81vmywtxaz swarm-225 Ready Active 28.3.3 q4fxgqgi2sp42wntxynks3wqf swarm-226 Ready Active 28.3.3 </cli> - 將 swarm-225 與 swarm-226 升級成主控點<cli> docker node promote swarm-225 docker node promote swarm-226 </cli> - 確認升級結果 <cli>docker node ls</cli><cli> portainer-186:~# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION ramtv89mfx2vcrekm7lsoobt8 moon-tv-195 Ready Active 28.3.3 318i734m5zx0w6iqe1q2ddijm * portainer-186 Ready Active Leader 28.3.3 i9zyahgszt2awip7dl1tckyz8 sbom-182 Ready Active 28.3.3 lxftp7j4emal33f81vmywtxaz swarm-225 Ready Active Reachable 28.3.3 q4fxgqgi2sp42wntxynks3wqf swarm-226 Ready Active Reachable 28.3.3 </cli> ==== 3. 建立 nfs volume 的作法 ==== - 先在 NFS Server 建立分享目錄與權限設定 參考 - [[tech/nfs]] - NFS Volume 的指定方式如下 Exp. NFS Serer: 192.168.1.159 , 分享目錄: /swarmdata/mystack/nfs-data <file> volumes: mystack_nfs-data: driver: local driver_opts: type: nfs o: "addr=192.168.1.159,rw,noatime,rsize=8192,wsize=8192,tcp,timeo=14,nfsvers=4" device: ":/swarmdata/mystack/nfs-data" </file> <note important> * 啟動 stack 時**不會**如同本地 volume 自動建立出目錄, 必須要在 NFS Server 先建立好指定的目錄 Exp.<cli>mkdir -p /swarmdata/mystack/nfs-data</cli> * 如想要修改 NFS Volume 定義 - 要將 stack 移除 Exp. <cli>docker stack rm mystack</cli> - 進入 swarm **每個 node 移除 volume** Exp.<cli>docker volume rm mystack_nfs-data</cli> - 重新部署 stack Exp. <cli>docker stack deploy -c mystack.yml mystack</cli> - 檢查新建立的 Volume 內容 Exp. <cli>docker volume inspect mystack_nfs-data</cli> </note> {{tag>docker k8s}} tech/docker_swarm.txt 上一次變更: 2025/11/19 11:49由 jonathan