服務運作方式
當 Docker Engine 處於 Swarm 模式時,若要部署應用程式映像檔,您需要建立一個「服務」(Service)。服務通常是指某個大型應用程式架構中,某個微服務所對應的映像檔。服務的例子可能包括 HTTP 伺服器、資料庫,或是任何您希望在分散式環境中執行的其他類型的可執行程式。
當您建立服務時,您可以指定要使用的容器映像檔以及要在執行中容器內執行的指令。您還可以為服務定義相關選項,包括:
- Swarm 讓服務在外部可存取的連接埠
- 用於讓服務連接到 Swarm 中其他服務的疊加網路 (Overlay network)
- CPU 與記憶體的限制 (limits) 與保留 (reservations)
- 滾動更新 (rolling update) 策略
- 在 Swarm 中要執行的映像檔複本數量
服務、任務與容器
當您將服務部署到 Swarm 時,Swarm 管理器 (manager) 會接受您的服務定義作為該服務的「預期狀態」(desired state)。接著,它會將服務排程到 Swarm 中的節點上,作為一個或多個複本「任務」(tasks)。這些任務會在 Swarm 的節點上彼此獨立地執行。
例如,假設您想要在三個 HTTP 監聽器執行個體之間進行負載平衡。下圖顯示了一個具有三個複本的 HTTP 監聽器服務。這三個監聽器執行個體中的每一個,都是 Swarm 中的一個任務。

容器是一個隔離的處理程序。在 Swarm 模式模型中,每個任務會呼叫且僅呼叫一個容器。任務類似於排程器放置容器的「插槽」(slot)。一旦容器啟動並執行,排程器就會確認該任務處於執行狀態。如果容器未通過健康檢查或終止,該任務就會終止。
任務與排程
任務是 Swarm 內排程的原子單位。當您透過建立或更新服務來宣告預期服務狀態時,協調器 (orchestrator) 會透過排程任務來實現該預期狀態。例如,您定義了一個服務,指示協調器始終保持三個 HTTP 監聽器執行個體執行。協調器會透過建立三個任務來回應。每個任務都是一個插槽,排程器透過產生一個容器來填補該插槽。容器是任務的實例化。如果 HTTP 監聽器任務隨後未通過健康檢查或崩潰,協調器會建立一個新的複本任務,進而產生一個新容器。
任務是一種單向機制。它會依序經過一系列狀態:已指派 (assigned)、已準備 (prepared)、執行中 (running) 等。如果任務失敗,協調器會移除該任務及其容器,然後根據服務指定的預期狀態建立一個新任務來取代它。
Docker Swarm 模式的底層邏輯是一個通用排程器和協調器。服務與任務的抽象概念本身並不知道它們實作的是什麼容器。理論上,您可以實作其他類型的任務,例如虛擬機器任務或非容器化的處理程序任務。排程器和協調器對於任務的類型是不知情的 (agnostic)。不過,目前版本的 Docker 僅支援容器任務。
下圖顯示了 Swarm 模式如何接收服務建立請求,並將任務排程到工作節點 (worker nodes) 上。

擱置中的服務 (Pending services)
服務的設定方式可能會導致目前 Swarm 中的任何節點都無法執行其任務。在此情況下,服務會保持在 pending (擱置中) 狀態。以下是一些服務可能保持在 pending 狀態的範例:
提示如果您只是想防止服務被部署,請將服務規模擴展 (scale) 為 0,而不是嘗試將其設定為保持在
pending狀態。
如果所有節點都處於暫停 (paused) 或排出 (drained) 狀態,且您建立了一個服務,該服務將會處於擱置狀態,直到節點可用為止。實際上,第一個可用的節點會獲取所有任務,因此在生產環境中這並不是一個好的做法。
您可以為服務保留特定數量的記憶體。如果 Swarm 中沒有任何節點擁有所需的記憶體數量,該服務將保持在擱置狀態,直到有可用於執行其任務的節點為止。如果您指定一個非常大的值(例如 500 GB),除非您真的有節點可以滿足此需求,否則該任務將永遠處於擱置狀態。
您可以對服務施加放置限制 (placement constraints),而這些限制有時可能無法達成。
這種行為說明了任務的需求和配置與 Swarm 的當前狀態並非緊密綁定。作為 Swarm 的管理員,您只需宣告 Swarm 的預期狀態,管理器就會與 Swarm 中的節點協同工作來建立該狀態。您不需要微觀管理 (micro-manage) Swarm 上的任務。
複本服務與全域服務
服務部署有兩種類型:複本 (replicated) 和全域 (global)。
對於「複本服務」,您需要指定想要執行的相同任務數量。例如,您決定部署一個具有三個複本的 HTTP 服務,每個複本提供相同的內容。
「全域服務」是一種在每個節點上執行一個任務的服務。沒有預先指定的任務數量。每次您將節點新增到 Swarm 時,協調器都會建立一個任務,排程器會將該任務指派給新節點。全域服務的理想候選者包括監控代理、防毒掃描器,或其他您希望在 Swarm 中每個節點上執行的容器。
下圖以灰色顯示了三複本服務,以黑色顯示了全域服務。
