Docker Cloud 提供一個整合的平台,方便管理 Docker 映像、容器和叢集。透過 Swarm 模式,Docker Cloud 與 Docker for AWS 整合,簡化了在 AWS 上佈署和管理 Docker Swarm 的流程。此整合方案結合了 Docker Cloud 的管理功能和 AWS 的雲端基礎設施,讓開發者能更有效率地建置、佈署和擴充套件應用程式。本文將探討如何設定 IAM 角色、建立和連線 Swarm,以及如何將現有 Swarm 匯入 Docker Cloud。 瞭解這些步驟能幫助開發者更好地運用 Docker Cloud 和 AWS 的優勢,提升容器化應用程式的佈署效率。

在 Docker Cloud 中使用 Swarm 模式

Docker for AWS 是根據 Docker Swarm 的託管服務,使用自定義的 Linux 發行版,並託管在 AWS 上,具備與 AWS 雲端平台整合的優勢,例如使用 CloudWatch 進行集中式日誌記錄、自定義除錯、自動擴充套件群組、彈性負載平衡和 DynamoDB 資料函式庫。

問題

雖然 AWS 是一個託管的雲端平台,但它並不是針對 Docker 容器、映像和服務的託管服務。Docker 的建置和測試仍需要整合。

解決方案

Docker Cloud 是一個託管服務,用於測試程式碼、建置 Docker 映像,並在 Docker Cloud 登入檔中建立和管理 Docker 映像儲存函式庫。Docker Cloud 也管理 Docker 容器、服務、堆積疊、節點和節點叢集。堆積疊是一組服務,而服務是一組容器。Docker Cloud 是一個整合的雲端服務,管理建置和映像、基礎架構、節點和應用程式。

Docker Cloud 也引入了 Swarm 模式來管理 Docker Swarm。在 Swarm 模式下,Docker Cloud 與 Docker for AWS 整合。因此,Docker Cloud Swarm 模式是兩個託管服務的整合:Docker for AWS 和 Docker Cloud。

Docker Cloud 提供一些 Docker 映像,用於在 Docker Swarm 和 Docker 主機客戶端之間進行互動,如表 14-1 所示。

表 14-1. Docker Swarm 的 Docker 映像

Docker 映像描述
dockercloud/client在客戶端使用,用於啟動互動式 shell,以使用 Docker ID 認證連線到遠端 Docker Swarm 叢集。
dockercloud/client-proxy在客戶端使用,用於將本地 Docker API 呼叫轉發到遠端 Swarm 叢集,並在每個請求中注入 Docker ID 認證資訊。
dockercloud/server-proxy對傳入的 Docker API 呼叫進行身份驗證和授權,然後將其轉發到本地 Docker 引擎。
dockercloud/registration將 Swarm 叢集註冊到 Docker Cloud,並啟動伺服器代理。

本章討論如何使用 Docker Cloud Swarm 模式在 AWS 上託管的基礎架構中組態 Docker Swarm。本章涵蓋以下主題:

  • 設定環境
  • 建立 IAM 角色
  • 在 Docker Cloud 中建立 Docker Swarm
  • 從 Docker 主機連線到 Docker Swarm
  • 從 Swarm 管理員連線到 Docker Swarm
  • 將 Swarm 匯入 Docker Cloud

設定環境

由於 Docker Cloud 是託管服務,因此只需要建立一個帳戶,可以在 https://cloud.docker.com/ 建立。同時也需要建立一個 AWS 帳戶,可以在 https://aws.amazon.com/resources/create-account/ 建立。此外,還需要在執行 Docker Swarm 的 EC2 例項的區域中建立一個金鑰對,如圖 14-1 所示。

建立 IAM 角色

Docker Cloud Swarm 模式需要一個具有新策略的 AWS 角色,這是一個嵌入式策略,用於 Docker for AWS。要建立 IAM 角色,請在網頁瀏覽器中導航至 https://console.aws.amazon.com/iam/home?#roles。按一下「建立新角色」,如圖 14-2 所示。

指定角色名稱

指定一個角色名稱(dockercloud-swarm-role),如圖 14-3 所示,然後按一下「下一步」。

選擇角色型別

顯示「選擇角色型別」頁面,如圖 14-4 所示。由於我們正在連結兩個服務——Docker Cloud 和 Docker for AWS——因此不需要選擇 AWS 服務角色。

選擇「跨帳戶存取的角色」,如圖 14-5 所示,然後選擇「在您的 AWS 帳戶和第三方 AWS 帳戶之間提供存取許可權」子選項。

接下來,指定第三方 AWS 帳戶的帳戶 ID,其 IAM 使用者將存取 AWS 帳戶。Docker Cloud 服務已設定了一個第三方 AWS 帳戶,其帳戶 ID 為 689684103426,任何人(AWS 使用者)都可以將 Docker Cloud 服務連結到其 AWS 帳戶時使用該 ID。將帳戶 ID 指定為 689684103426,如圖 14-6 所示。外部 ID 是使用者在 https://cloud.docker.com/ 建立的 Docker Cloud 服務帳戶的 Docker ID。雖然對每個人來說,帳戶 ID 都相同(689684103426),但不同使用者的外部 ID 將不同。保持「需要 MFA」核取方塊未被選中。按一下「下一步」。

新增嵌入式策略

由於我們正在嵌入自定義策略,因此不要從「附加策略」中選擇任何列出的策略。按一下「下一步」,如圖 14-7 所示。

在「檢閱」頁面上,按一下「建立角色」,如圖 14-8 所示。

一個名為 dockercloud-swarm-role 的新 AWS IAM 角色已建立,如圖 14-9 所示。按一下 dockercloud-swarm-role 角色名稱。

接下來,我們將新增一個嵌入式(也稱為內聯)策略。預設情況下應選中「許可權」標籤。按一下 v 圖示以展開「內聯策略」部分,如圖 14-10 所示。

在「設定許可權」中,使用「選擇」按鈕選擇「自定義策略」,如圖 14-12 所示。

要開始,沒有列出任何內聯策略。按一下「在此新增內聯策略」的連結,如圖 14-11 所示。

一個策略檔案列出了一些許可權,用於 Docker for AWS 的 IAM 角色的策略檔案可以從 https://docs.docker.com/docker-for-aws/iam-permissions/ 獲得。按一下「驗證策略」以驗證策略,如圖 14-13 所示。

按一下「套用策略」,如圖 14-14 所示。

為 dockercloud-swarm-role 角色新增了一個新的內聯策略,如圖 14-15 所示。

複製圖 14-16 中列出的角色 ARN 字串,因為我們需要 ARN 字串從 Docker Cloud 連線到 AWS 雲提供者。

在 Docker Cloud 中建立 Docker Swarm

在本文中,我們從 Docker Cloud 服務建立一個 Docker Swarm。在 https://cloud.docker.com/ 登入 Docker Cloud 服務。「雲端登入檔」頁面應該顯示在 https://cloud.docker.com/app/dvohra/dashboard/onboarding/cloud-registry。在邊緣有一個 Swarm Mode 選項,預設情況下它已關閉,如圖 14-17 所示。

按一下「Swarm Mode」滑桿;Swarm Mode 應該會被啟用,如圖 14-18 所示。 新增了一個 Swarms工具列選項,如圖14-19所示。

使用 Plantuml 圖表呈現流程

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title Docker Cloud Swarm 模式佈署與整合

package "Docker 架構" {
    actor "開發者" as dev

    package "Docker Engine" {
        component [Docker Daemon] as daemon
        component [Docker CLI] as cli
        component [REST API] as api
    }

    package "容器運行時" {
        component [containerd] as containerd
        component [runc] as runc
    }

    package "儲存" {
        database [Images] as images
        database [Volumes] as volumes
        database [Networks] as networks
    }

    cloud "Registry" as registry
}

dev --> cli : 命令操作
cli --> api : API 呼叫
api --> daemon : 處理請求
daemon --> containerd : 容器管理
containerd --> runc : 執行容器
daemon --> images : 映像檔管理
daemon --> registry : 拉取/推送
daemon --> volumes : 資料持久化
daemon --> networks : 網路配置

@enduml

此圖表展示了使用Docker Cloud Swarm模式的主要步驟,從建立IAM角色到連線到Docker Swarm的流程。

連線到Docker Swarm

要連線到Docker Swarm,首先需要在Docker Cloud中啟用Swarm Mode。如前所述,這涉及到在Docker Cloud控制檯中切換Swarm Mode選項。一旦Swarm Mode被啟用,您就可以透過多種方式連線到Docker Swarm,包括使用Docker客戶端或Swarm管理器。

從Docker主機連線到Docker Swarm

要從Docker主機連線到Docker Swarm,您需要使用dockercloud/clientdockercloud/client-proxy映像。這些映像允許您從本地Docker客戶端連線到遠端的Docker Swarm叢集。使用這些映像時,您需要提供您的Docker ID認證,以便進行身份驗證和授權。

從Swarm管理器連線到Docker Swarm

Swarm管理器是用於管理Docker Swarm叢集的工具。要從Swarm管理器連線到Docker Swarm,您需要使用dockercloud/server-proxy映像,該映像對傳入的Docker API呼叫進行身份驗證和授權,然後將其轉發到本地Docker引擎。

將Swarm匯入Docker Cloud

一旦您的Docker Swarm叢集執行,您就可以將其匯入Docker Cloud。這允許您使用Docker Cloud的託管服務來管理和監控您的Swarm叢集,包括建置和測試、基礎架構管理以及應用程式佈署。

在 Docker Cloud 中使用 Swarm 模式

建立新的 Swarm

在 Docker Cloud 中建立 Swarm 有兩種方式:自帶 Swarm 或建立新的 Swarm。點選「Create」以建立新的 Swarm,如圖 14-20 所示。

設定 Swarm

接下來,我們將設定 Swarm,包括指定 Swarm 名稱、選擇雲端服務提供者以及設定雲端服務提供者的選項。目前支援兩種雲端服務提供者:Amazon Web Services (AWS) 和 Microsoft Azure(尚未開放)。本章節將使用 AWS 進行示範。我們需要使用先前複製的 ARN 字串來設定 AWS 的雲端設定。雲端設定的組態有兩種方式。

組態雲端設定

一種方式是從帳戶中選擇雲端設定,如圖 14-21 所示。點選 Amazon Web Services 提供者旁的「Connect Provider」圖示,如圖 14-22 所示,將顯示「Add AWS Credentials」對話方塊,如圖 14-23 所示。

在「Add AWS Credentials」對話方塊中,輸入先前複製的 ARN 字串並點選「Save」,如圖 14-25 所示。

另一種組態雲端設定的方式是點選 Amazon Web Service 服務提供者的圖示,如圖 14-24 所示,同樣會顯示「Add AWS Credentials」對話方塊。

連線服務提供者

無論採用哪種方式,Amazon Web Services 服務提供者都應顯示為已連線,如圖 14-26 和圖 14-27 所示。

指定 Swarm 名稱和建立 Swarm

指定一個有效的 Swarm 名稱(例如 docker-cloud-swarm),選擇已連線的 Amazon Web Services 服務提供者,然後點選「Create」,如圖 14-29 所示。

在區域選項中,選擇一個區域(例如 us-east-2)、Swarm 管理員數量(例如 3)、Swarm 工作節點數量(例如 5)、Swarm 管理員例項型別(例如 t2.micro)和代理工作節點例項型別(例如 t2.micro),並選擇 SSH 金鑰。點選「Create」以開始建立 Swarm,如圖 14-30 所示。

Swarm 建立過程

Swarm 開始佈署後,狀態將顯示為「DEPLOYING」,如圖 14-31 所示。當 Swarm 成功佈署後,狀態將變更為「Deployed」,如圖 14-32 所示。

建立 AWS 資源

Docker Cloud 將為 Swarm 建立並組態 AWS 資源,包括建立 CloudFormation 堆積疊,如圖 14-33 所示。同時,會新增一個新的代理 AWS IAM 角色給 Swarm,如圖 14-34 所示。

為 Swarm 管理員和工作節點啟動 EC2 例項,每個 EC2 例項都會自動使用建立的代理 IAM 角色,如圖 14-35 所示。

連線到 Docker Swarm

有兩種方式可以連線到 Docker Swarm:

  1. 從任何 Docker 主機直接連線。
  2. 從 EC2 控制檯取得 Swarm 管理員的公用 IP 地址,並使用 SSH 登入到 Swarm 管理員。

從 Docker 主機連線到 Docker Swarm

在 Docker Cloud 控制檯中點選 Docker Swarm,將顯示包含 docker run 命令的「Connect To」對話方塊,如圖 14-38 所示。複製該 docker run 命令。

建立 CoreOS EC2 例項並連線

啟動一個具有 CoreOS AMI 的 EC2 例項,該例項預先安裝了 Docker,如圖 14-39 所示。從 EC2 控制檯取得 CoreOS 例項的公用 IP 地址,如圖 14-40 所示。使用 SSH 登入到 CoreOS 例項。

ssh -i "coreos.pem" core@34.207.220.127

執行先前複製的命令以連線到 Docker Swarm。

docker run --rm -ti -v /var/run/docker.sock:/var/run/docker.sock -e DOCKER_HOST dockercloud/client dvohra/docker-cloud-swarm

連線結果

成功執行命令後,即可連線到 Docker Swarm,並可進行進一步的管理和佈署操作。

在 Docker Cloud 中使用 Swarm 模式

連線到 Docker Swarm

要連線到 Docker Swarm,可以使用 dockercloud/client Docker 映象。首先,下載 dockercloud/client 映象並執行容器。

docker run --rm -ti -v /var/run/docker.sock:/var/run/docker.sock -e DOCKER_HOST dockercloud/client dvohra/docker-cloud-swarm

執行後,會提示輸入 Docker Cloud 的使用者名稱和密碼。輸入正確的憑證後,會輸出一個 export 命令,用於連線到 Swarm。

內容解密:

  • docker run --rm -ti -v /var/run/docker.sock:/var/run/docker.sock -e DOCKER_HOST dockercloud/client dvohra/docker-cloud-swarm:執行 dockercloud/client 映象並掛載 Docker socket,以便與本地 Docker 守護程式通訊。
  • -e DOCKER_HOST:設定環境變數 DOCKER_HOST,以指定 Docker 守護程式的位置。
  • 輸入使用者名稱和密碼後,輸出 export DOCKER_HOST 命令,用於設定環境變數以連線到 Swarm。

連線到 Swarm 管理節點

另一種連線到 Swarm 的方法是使用 Swarm 管理節點的公共 IP 地址。首先,從 EC2 控制檯取得 Swarm 管理節點的公共 IP 地址。

使用 SSH 登入 Swarm 管理節點

ssh -i "docker.pem" docker@52.14.146.223

登入後,可以使用 docker node ls 命令列出 Swarm 中的節點。

內容解密:

  • ssh -i "docker.pem" docker@52.14.146.223:使用 SSH 登入 Swarm 管理節點,-i 指定私鑰檔案。
  • docker node ls:列出 Swarm 中的節點,包括其狀態和管理狀態。

建立服務

連線到 Swarm 後,可以使用 docker service create 命令建立服務。

docker service create \
--name hello-world \
--publish 8080:80 \
--replicas 1 \
tutum/hello-world

建立服務後,可以使用 docker service ls 命令列出服務。

內容解密:

  • docker service create:建立一個新的服務。
  • --name hello-world:指定服務名稱為 hello-world
  • --publish 8080:80:將主機的 8080 埠對映到容器的 80 埠。
  • --replicas 1:指定服務的副本數量為 1。
  • tutum/hello-world:指定使用的 Docker 映象。

將現有的 Swarm 匯入 Docker Cloud

Docker Cloud 支援匯入現有的 Swarm。要匯入 Swarm,需要滿足以下先決條件:

  • 根據 Docker Engine 1.13 或更高版本的節點。
  • Swarm 管理節點的 2376 埠未被阻塞。

初始化新的 Swarm

docker swarm init --advertise-addr 172.31.23.196

初始化後,可以使用輸出的 docker swarm join 命令將工作節點加入 Swarm。

內容解密:

  • docker swarm init --advertise-addr 172.31.23.196:初始化一個新的 Swarm,並指定廣告地址。
  • 輸出的 docker swarm join 命令:用於將工作節點加入 Swarm。