Docker Swarm:面向實際環境的容器編排

最後更新: 28月2026
  • Docker Swarm 可讓您建立節點集群,以編排具有高可用性和整合負載平衡的容器化服務。
  • 節點、管理器、工作節點、服務、任務和覆蓋網路等概念是理解 Swarm 如何管理和分發容器的基礎。
  • docker swarm init、docker service create 或 docker service scale 等指令讓部署、擴充和更新應用程式變得容易。
  • Swarm 非常適合中小型項目,可與雲端服務、DevOps 實踐、人工智慧和商業智慧整合。

Docker Swarm 容器編排

如果僅依賴基本的 Docker 功能,管理分佈在多台機器上的數十甚至數百個容器會變得非常棘手。當涉及到高可用性、自動擴展或零停機部署時,僅僅管理單一容器是不夠的:你需要容器​​編排。而 Docker Swarm 正是為此而生,它是 Docker 提供的用於協調叢集中容器的原生解決方案。

如果您之前在單機上使用 Docker Compose,但發現它無法滿足實際環境的需求,那麼 Swarm 就是下一個合乎邏輯的選擇。它允許您建立節點集群,將服務分佈在這些節點上,進行負載平衡,替換崩潰的容器,並最終將眾多伺服器整合到一個統一的、可用於生產環境的平台中,而無需直接遷移到Kubernetes(如果您覺得它過於繁瑣或複雜)。

什麼是 Docker Swarm?它在容器編排中為何如此重要?

Docker Swarm 是直接內建在 Docker 中的叢集和編排引擎。它不是一個外部工具,而是 Docker 引擎本身的一種運作模式,它允許你將多台機器(實體機或虛擬機)組合成一個邏輯集群,稱為 Swarm,並在該集群上部署服務,而不是部署孤立的容器。

Swarm 的妙處在於它抽象化了所有節點,讓你感覺就像擁有一個「超級伺服器」。你只需定義服務、副本數量、暴露連接埠和各種限制,Swarm 就會決定每個容器(任務)的運作位置、節點故障時如何重新分配資源以及如何在它們之間平衡流量。

在容器編排方面,Docker Swarm 能夠滿足許多 DevOps 團隊的典型需求:易於橫向擴展、基本高可用性、內部負載平衡、節點間分層網路以及可控部署,使其非常適合微服務架構。它特別適用於中小型項目,或對 Docker 生態系統非常熟悉但不需要 Kubernetes 全部複雜性的組織。

Swarm 非常適合那些以簡潔性為關鍵的場景:例如實驗室、預發布環境、中小企業內部集群,甚至是不想管理複雜平台的雲端生產環境。此外,它還能與已使用 Docker 進行應用程式打包的 CI/CD 管線和 DevOps 實踐無縫整合。

用於容器的 Docker Swarm 集群

Docker Swarm 的關鍵概念:節點、服務與網路

在你開始瘋狂輸入指令之前,你必須先了解 Swarm 如何指涉每個元件。這些概念你會在命令列介面 (CLI) 和文件中反覆看到。

節點是指叢集中的任何一台機器;它可以是實體伺服器、雲端虛擬機,甚至是測試環境中的筆記型電腦。每個節點都運行 Docker Engine,並使用特定角色向叢集註冊。

管理節點:這是叢集的核心。它負責維護集群的預期狀態、調度任務和協調操作。為了確保控制平面的高可用性,可以有多個管理節點,但其中一個會作為領導者,協調其他節點。

工作節點:這些是叢集中的「工作節點」。它們不參與編排決策;它們只執行管理員分配給它們的任務(容器)。這樣,運算能力就可以根據需要透過增加更多工作節點來擴展。

在 Swarm 中,服務是部署的基本單元。它定義了要使用的容器鏡像、副本數量、連接埠、環境變數、配置、金鑰和其他選項。與使用 `docker run` 運行單一容器不同,`docker service create` 描述的是 Swarm 維護的、處於所需狀態的服務。

任務是與服務關聯並分配給節點的容器的具體實例。如果您要求一個具有 3 個副本的服務,Swarm 會建立 3 個任務。如果某個任務失敗,管理器會建立另一個任務以維持副本數量。

覆蓋網路:這是一種分散式虛擬網絡,它允許位於不同節點上的容器像在同一本地網路上一樣進行通訊。 Swarm 依靠這些覆蓋網路來連接服務、在副本之間進行負載平衡以及隔離應用程式。

第一步:初始化和測試 Docker Swarm 集群

如果你的機器上已經安裝了 Docker ,那麼建立一個基本的叢集就非常簡單。你不需要任何額外的軟體:只需啟用叢集模式並將節點加入叢集即可。

  瞭解電腦系統的 9 個關鍵點

步驟 1:建立第一個管理器。在要用作初始管理器節點的機器上,運行:

docker swarm init --advertise-addr

`--advertise-addr` 參數指定其他節點用於檢視此管理員的 IP 位址。執行該命令後,Docker 將自動顯示一個令牌和一個命令,供其他節點加入叢集成為工作節點。

步驟 2:將工作節點加入叢集。在每台將作為工作節點的機器上,執行類似如下的命令:

docker swarm join --token :2377

加入令牌和管理員的 IP 位址由 `docker swarm init` 指令輸出。預設情況下,控制通訊使用 2377 連接埠。此後,該節點將作為叢集的一部分出現,並準備好接收任務。

檢查叢集狀態非常簡單,只需登入管理器(在單獨的工作節點上不起作用)並執行以下命令:

docker 節點 ls

此指令會顯示叢集中的所有節點,包括它們的 ID、主機名稱、角色(管理節點或工作節點)和目前狀態。透過此命令,您可以偵測是否有節點宕機、處於資源耗盡模式或遇到連線問題。

在 Docker Swarm 中部署服務:從第一個 nginx 到生產環境

叢集啟動並運行後,精彩的部分就開始了:部署服務。您無需使用 `docker run` 指令啟動單一容器,而是定義由 Swarm 自動維護和重新平衡的服務。

使用以下命令即可建立像 Nginx Web 伺服器這樣可以從叢集外部存取的簡單服務:

docker service create –name my-nginx -p 80:80 nginx

這將啟動一個名為 my-nginx 的服務,將容器的 80 連接埠暴露給叢集節點的 80 連接埠。 Swarm 會負責發布該服務,並在您擴展叢集時,將傳入的請求負載平衡到不同的副本上。

列出已部署的服務有助於您追蹤叢集中正在執行的服務:

docker 服務 ls

這裡顯示服務名稱、服務模式以及目前/期望副本數(格式為 3/5)。例如,如果顯示 3/5,則表示服務仍在建立任務以達到期望狀態。

透過檢查特定服務的任務詳情和狀態,您可以確定每個實例在哪個節點上運行:

docker service ps my-nginx

輸出結果顯示任務、分配的節點、狀態(運行中、準備中、關閉中等)、使用的鏡像、運行時間。這對於調試部署或負載平衡問題至關重要。

生命週期管理:服務的擴充、升級與刪除

編排的一大優點在於能夠擴展和更新服務,而無需逐個伺服器進行操作。 Swarm 使得透過命令列即可輕鬆實現這一點。

在 Docker Swarm 中擴充服務意味著指定所需的服務副本總數。例如,如果您建立 my-nginx 時只有一個副本,現在想將其增加到三個副本:

docker service scale my-nginx=3

Swarm 負責在可用節點上調度新任務,並會考慮工作節點的資源和狀態。如果以後需要更多容量,可以升級到五個副本:

docker service scale my-nginx=5

更新服務鏡像也是關鍵所在,尤其是在生產環境中。與其手動停止和刪除容器,不如執行受控更新:

docker service update –image nginx:latest my-nginx

此命令指示 Swarm 依照定義的更新策略(預設為捲動更新)逐步將現有任務遷移到新鏡像。這最大限度地減少了對最終用戶的影響。

當您不再需要某項服務時,將其移除也是在叢集層級完成的,而不是在單一容器層級完成的:

docker service rm my-nginx

這將停止並移除 Swarm 中所有相關的任務,從而釋放節點上的資源。這是一種乾淨俐落的方式來停用架構中不再適用的元件。

指導練習:建立自己的叢集並部署服務

為了鞏固概念,沒有什麼比在實驗室環境中,使用本地虛擬機器或廉價的雲端實例進行複現的小練習更好的了。

練習 1:配置 Docker Swarm 叢集。目標是至少配置三個節點:一個作為管理節點,兩個作為工作節點。在管理節點上,使用以下命令啟用 Swarm:

docker swarm init --advertise-addr

接下來,複製輸出中顯示的join 命令,並在每個工作節點上執行它:

docker swarm join --token :2377

檢查以下各項是否進展順利:

  10 個關鍵面向:什麼是管理資訊系統?

docker 節點 ls

您會看到管理器處於「領導者」狀態,工作進程處於「活動」狀態。如果任何進程顯示為“已關閉”,請檢查網路連線、防火牆和 Docker 版本。

練習 2:部署和擴展服務。叢集準備好後,建立一個可透過 HTTP 存取的 nginx 服務:

docker service create –name my-nginx -p 80:80 nginx

請用以下命令檢查其是否存在:

docker 服務 ls

使用以下方法將服務擴展到三個副本:

docker service scale my-nginx=3

使用以下命令檢查任務部署位置:

docker service ps my-nginx

作為該練習的基本解決方案,您應該看到三個任務分佈在不同的節點上(如果資源充足),並且當向叢集的 80 連接埠發出 HTTP 請求時,Swarm 將根據其內部負載平衡器將流量路由到不同的副本。

Docker Swarm 相較於手動容器管理的優勢

使用 Swarm 而不是啟動單一容器可以帶來許多好處,當您需要的不僅僅是一個簡單的測試環境時,這些好處就會變得顯而易見。

整合到 Docker CLI 中的簡單部署:您無需學習全新的工具;服務和叢集管理命令與您使用 docker run、docker ps 或 docker images 所做的非常相似。

內建負載平衡:當您使用 `-p` 參數暴露服務時,Swarm 會在必要的節點上廣播端口,並將流量分配到可用的副本上。您無需新增像Traefik這樣基本的外部負載平衡器來分配請求,從而簡化了初始架構。

高可用性和容錯性:如果容器崩潰或工作節點發生故障,Swarm 會偵測到任務遺失,並嘗試在其他節點上重新建立這些任務,以維持副本數量。這可以防止因孤立故障導致的許多服務中斷。

集中管理所需狀態:您只需聲明所需的副本數量、使用的鏡像、要開放的連接埠以及要套用的限制,叢集就會負責收斂到該狀態。未來的變更(更新、擴容、節點淘汰)也透過此控制平面進行管理。

在專案中何時使用 Docker Swarm 才合適?

並非所有情況都需要 Kubernetes 或強大的微服務。 Docker Swarm 非常適合許多需要兼顧簡易性和編排能力的用例。

中小型生產集群:如果您管理幾個業務應用程式、API 或內部服務,並且您的基礎設施規模不大,那麼 Swarm 可以提供您所需的一切,而無需您學習龐大的生態系統。

對於那些與 Docker 深度集成,並希望快速過渡到編排模式,但又不想被 Kubernetes 的學習曲線所困擾的團隊來說,Swarm 是一個理想的選擇。由於 Swarm 本身就是 Docker 引擎的一部分,因此過渡過程通常會更加平滑且快速。

在雲端環境和分散式架構中,您希望繼續使用來自主流供應商的託管服務(資料庫、訊息佇列、儲存等),同時您的應用程式運行在由 Swarm 編排的容器中。這是一種將簡易性與雲端功能結合的明智之選。

在需要建立鏡像、將其上傳到鏡像倉庫並自動部署到叢集的管線的DevOps 和自動化用例中, Swarm 能夠很好地與 CI/CD 工具集成,並有助於實現快速的持續交付週期。

當您需要極致的控制、龐大的生態系統或複雜的整合時, Kubernetes 可能更合適。但對於許多實際專案而言,Swarm 能夠以更少的運維摩擦提供必要的編排功能。

實用指南和DevOps方法:從基礎知識到進階部署

如果你曾因為Docker Swarm 相關零散的教學、奇怪的生產錯誤和不連貫的文件而感到迷茫,你並不孤單。許多開發和維運團隊在從獨立容器遷移到編排平台時都會遇到類似的難題。

一份全面的 Swarm DevOps 指南通常由幾個關鍵模組組成。首先,它會介紹 Docker 的基礎知識:映像建立、容器管理和最佳化、鏡像倉庫的使用以及最佳打包實踐。這個堅實的基礎對於防止後續的編排工作變成一場噩夢至關重要。

接下來,我們將深入探討網路和持久化:Docker 網路類型(橋接、主機、覆蓋、macvlan)、磁碟區管理和資料持久化,以及如何使用 Docker Compose 部署多容器應用程式。這將幫助您清楚地了解在將技術堆疊部署到分散式叢集之前,其應有的結構。

下一階段的重點是實現 Swarm 服務,涵蓋從叢集初始化到進階功能(例如金鑰、配置和堆疊)的所有內容。您將在此階段使用聲明式服務定義、加密憑證以及跨容器共用的配置。

另一個關鍵領域是負載平衡、日誌和可觀測性:學習如何正確地暴露服務、查看日誌、識別瓶頸並應用故障排除技巧,以維持日常的高可用性。對於系統監控和診斷,一份涵蓋指標和警報的進階監控指南將非常有用。

  如何在Mac上識別和管理後台進程

最後,所有內容都整合到 DevOps 管線中,並輔以實際的程式設計練習:從自動化鏡像建置到跨叢集的持續部署,確保每次程式碼變更都能可靠且可重複地部署到生產環境中。

進階篇:Docker 網路及 Swarm 的後續步驟

一旦你掌握瞭如何啟動叢集和第一個服務,下一步通常是徹底了解你的容器如何相互溝通以及如何與外部世界通訊。

Docker橋接網路和主機網路負責單一機器上的大部分通信,而覆蓋網路則是連接叢集中不同節點容器的關鍵。了解它們的差異、何時使用哪種網路以及它們如何與外部防火牆和負載平衡器交互,對於避免在生產環境中出現意外情況至關重要。

像 macvlan 這樣的網路可讓您將實體網路中的「真實」IP 位址指派給容器,這在需要服務在網路層級像獨立主機一樣運作的特定環境中非常有用,但它也增加了複雜性和額外的設定要求。

深入了解 Docker 網路將有助於您更好地將 Swarm 服務設計與組織或雲端供應商的網路拓撲結構相匹配,明確定義哪些服務是內部的,哪些服務暴露在外部,以及如何在環境(開發、測試、生產)之間劃分流量。

Swarm 的另一個有趣發展方向是更深入地利用金鑰和配置來管理憑證、憑證和設定文件,而無需將它們直接嵌入鏡像或使用普通的環境變數。這提高了安全性,並使環境管理更加井然有序。

基於 Docker Swarm 建置的客製化開發、雲端服務和商業智慧服務

容器編排並非獨立於IT生態系的其他部分。專注於客製化應用程式和客製化軟體的開發公司通常依賴Swarm等容器平台來提供更強大、更具可擴展性的解決方案。

將 Swarm 與 AWS 和 Azure 雲端服務集成,可實現靈活叢集的部署。

利用託管雲端元件(資料庫、訊息佇列、物件儲存),同時保持對容器執行層的直接控制。

同時,面向企業的人工智慧和 AI非常適合與容器進行協調的環境:AI 模型、推理微服務和 AI 代理可以作為 Swarm 服務運行,並根據負載進行擴展,從而防止單一機器成為瓶頸。

在商業智慧和 Power BI 領域,將後端部署在 Docker Swarm 上,可以更輕鬆地從 API、ETL 服務和處理管道中可靠地提取資料。編排機制確保這些服務始終可用,從而為儀表板和分析提供資料。

在此背景下,網路安全的重要性日益凸顯:配置完善的集群,透過TLS通訊、受控鏡像更新、漏洞掃描和集中式金鑰管理,相較於獨立容器的混亂部署,能夠有效降低風險。此外,強化措施和門禁控制也能進一步提升環境的整體安全性。

最終,將客製化開發、雲端服務、人工智慧和商業智慧結合在 Docker Swarm 等編排平台上,可以建立現代化、可擴展且具有彈性的解決方案,而不會增加技術複雜性或營運成本。

掌握 Docker Swarm 作為容器編排工具,能讓你在 DevOps 領域佔據非常強大的地位:你將不再為分散的容器和脆弱的部署而苦惱,而是能夠使用一個連貫、可擴展且安全的集群,該集群能夠支持從簡單的 Web 應用程序到具有雲服務、人工智能、自動化和集成商業智能解決方案的分佈式架構的一切。

Docker Swarm edge
相關文章:
Docker Swarm 和 Portainer Edge 用於邊緣部署