在 swarm 模式下執行 Docker Engine

當您首次安裝並開始使用 Docker Engine 時,Swarm 模式預設是停用的。當您啟用 Swarm 模式時,您將使用透過 docker service 命令管理的服務概念。

有兩種方式可以在 Swarm 模式下執行引擎:

當您在本地計算機上以 Swarm 模式執行引擎時,您可以基於自己建立的映象或其他可用映象來建立和測試服務。在您的生產環境中,Swarm 模式提供了一個具有叢集管理功能的容錯平臺,以保持您的服務持續執行和可用。

這些說明假定您已在一臺計算機上安裝了 Docker Engine,該計算機將作為 swarm 中的管理節點。

如果您還沒有閱讀過 Swarm 模式關鍵概念,請先閱讀,並嘗試 Swarm 模式教程

建立 swarm

當您執行建立 swarm 的命令時,Docker Engine 開始以 Swarm 模式執行。

執行 docker swarm init 在當前節點上建立一個單節點 swarm。引擎會按以下方式設定 swarm:

  • 將當前節點切換到 Swarm 模式。
  • 建立一個名為 default 的 swarm。
  • 將當前節點指定為 swarm 的領導者管理節點。
  • 使用計算機主機名命名該節點。
  • 配置管理器在活動網路介面的 2377 埠上監聽。
  • 將當前節點設定為 Active 可用性,這意味著它可以接收來自排程器的任務。
  • 為參與 swarm 的引擎啟動一個內部分散式資料儲存,以維護對 swarm 及在其上執行的所有服務的一致檢視。
  • 預設情況下,為 swarm 生成一個自簽名的根 CA。
  • 預設情況下,為工作節點和管理節點生成加入 swarm 的令牌。
  • 建立一個名為 ingress 的覆蓋網路,用於向 swarm 外部發布服務埠。
  • 為您的網路建立覆蓋網路的預設 IP 地址和子網掩碼。

docker swarm init 的輸出提供了當您將新的工作節點加入 swarm 時要使用的連線命令:

$ docker swarm init
Swarm initialized: current node (dxn1zf6l61qsb1josjja83ngz) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join \
    --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
    192.168.99.100:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

配置預設地址池

預設情況下,Swarm 模式對全域性範圍(覆蓋)網路使用預設地址池 10.0.0.0/8。每個沒有指定子網的網路都將從此池中順序分配一個子網。在某些情況下,可能需要為網路使用不同的預設 IP 地址池。

例如,如果預設的 10.0.0.0/8 範圍與您網路中已分配的地址空間衝突,那麼最好確保網路使用不同的範圍,而無需 swarm 使用者使用 --subnet 命令指定每個子網。

要配置自定義的預設地址池,您必須在 swarm 初始化時使用 --default-addr-pool 命令列選項定義池。此命令列選項使用 CIDR 表示法來定義子網掩碼。要為 Swarm 建立自定義地址池,您必須定義至少一個預設地址池,以及一個可選的預設地址池子網掩碼。例如,對於 10.0.0.0/27,使用值 27

Docker 從 --default-addr-pool 選項指定的地址範圍中分配子網地址。例如,命令列選項 --default-addr-pool 10.10.0.0/16 表示 Docker 將從該 /16 地址範圍中分配子網。如果未指定 --default-addr-pool-mask-len 或明確設定為 24,這將導致 256 個形式為 10.10.X.0/24/24 網路。

子網範圍來自 --default-addr-pool(例如 10.10.0.0/16)。這裡的 16 大小表示可以在該 default-addr-pool 範圍內建立的網路數量。--default-addr-pool 選項可以多次出現,每個選項都提供額外的地址供 Docker 用於覆蓋網路子網。

該命令的格式是:

$ docker swarm init --default-addr-pool <IP range in CIDR> [--default-addr-pool <IP range in CIDR> --default-addr-pool-mask-length <CIDR value>]

10.20.0.0 網路建立一個具有 /16(B 類)的預設 IP 地址池的命令如下所示:

$ docker swarm init --default-addr-pool 10.20.0.0/16

10.20.0.010.30.0.0 網路建立一個具有 /16(B 類)的預設 IP 地址池,併為每個網路建立一個 /26 的子網掩碼的命令如下所示:

$ docker swarm init --default-addr-pool 10.20.0.0/16 --default-addr-pool 10.30.0.0/16 --default-addr-pool-mask-length 26

在此示例中,docker network create -d overlay net1 將導致 10.20.0.0/26 作為 net1 的分配子網,而 docker network create -d overlay net2 將導致 10.20.0.64/26 作為 net2 的分配子網。這將持續進行,直到所有子網都被用盡。

有關更多資訊,請參閱以下頁面:

  • Swarm 網路,瞭解有關預設地址池用法的更多資訊
  • docker swarm init CLI 參考,瞭解有關 --default-addr-pool 標誌的更多詳細資訊。

配置通告地址

管理節點使用一個通告地址(advertise address)來允許 swarm 中的其他節點訪問 Swarmkit API 和覆蓋網路。swarm 上的其他節點必須能夠透過其通告地址訪問管理節點。

如果您不指定通告地址,Docker 會檢查系統是否只有一個 IP 地址。如果是,Docker 預設使用該 IP 地址和監聽埠 2377。如果系統有多個 IP 地址,您必須指定正確的 --advertise-addr 以啟用管理器間通訊和覆蓋網路。

$ docker swarm init --advertise-addr <MANAGER-IP>

如果其他節點訪問第一個管理節點的地址與該管理節點自身看到的地址不同,您也必須指定 --advertise-addr。例如,在一個跨越不同區域的雲設定中,主機既有用於區域內訪問的內部地址,也有用於從該區域外部訪問的外部地址。在這種情況下,請使用 --advertise-addr 指定外部地址,以便該節點可以將該資訊傳播給隨後連線到它的其他節點。

請參閱 docker swarm init CLI 參考,瞭解有關通告地址的更多詳細資訊。

檢視加入命令或更新 swarm 加入令牌

節點需要一個秘密令牌才能加入 swarm。工作節點的令牌與管理節點的令牌不同。節點僅在加入 swarm 的那一刻使用加入令牌。在節點已經加入 swarm 後輪換加入令牌不會影響該節點的 swarm 成員身份。令牌輪換可確保舊令牌不能被任何試圖加入 swarm 的新節點使用。

要檢索包括工作節點加入令牌在內的加入命令,請執行:

$ docker swarm join-token worker

To add a worker to this swarm, run the following command:

    docker swarm join \
    --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
    192.168.99.100:2377

This node joined a swarm as a worker.

要檢視管理節點的加入命令和令牌,請執行:

$ docker swarm join-token manager

To add a manager to this swarm, run the following command:

    docker swarm join \
    --token SWMTKN-1-59egwe8qangbzbqb3ryawxzk3jn97ifahlsrw01yar60pmkr90-bdjfnkcflhooyafetgjod97sz \
    192.168.99.100:2377

傳遞 --quiet 標誌以僅列印令牌:

$ docker swarm join-token --quiet worker

SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c

請小心處理加入令牌,因為它們是加入 swarm 所必需的秘密。特別地,將秘密檢入版本控制是一種不好的做法,因為它將允許任何有權訪問應用程式原始碼的人向 swarm 中新增新節點。管理令牌尤其敏感,因為它們允許新的管理節點加入並獲得對整個 swarm 的控制權。

我們建議您在以下情況下輪換加入令牌:

  • 如果令牌被意外檢入版本控制系統、群聊或意外列印到您的日誌中。
  • 如果您懷疑某個節點已遭入侵。
  • 如果您希望保證沒有新節點可以加入 swarm。

此外,為任何秘密(包括 swarm 加入令牌)實施定期的輪換計劃是一種最佳實踐。我們建議您至少每 6 個月輪換一次令牌。

執行 swarm join-token --rotate 以使舊令牌失效並生成新令牌。指定您是要輪換 worker 還是 manager 節點的令牌:

$ docker swarm join-token  --rotate worker

To add a worker to this swarm, run the following command:

    docker swarm join \
    --token SWMTKN-1-2kscvs0zuymrsc9t0ocyy1rdns9dhaodvpl639j2bqx55uptag-ebmn5u927reawo27s3azntd44 \
    192.168.99.100:2377

瞭解更多