在雲端環境中佈署和管理容器化應用程式已成為現代軟體開發的趨勢。本文將引導讀者使用 Docker for AWS,一步步建立多區域 Swarm 叢集,並探討 Docker 服務的管理技巧。從連線 Swarm 管理節點開始,我們將涵蓋操作叢集、建立和擴充套件服務,以及最終刪除叢集等關鍵步驟。為了更清晰地說明操作流程,文章將以建立 Hello World 和 MySQL 服務為例,詳細說明服務建立、副本控制、埠對映、更新策略等核心概念。透過實際案例的操作,讀者可以更快速地掌握 Docker Swarm 的佈署和管理方法,並應用於實際的專案開發中。

使用 Docker 在 AWS 上建立多區域 Swarm 叢集

本章節將探討如何利用 Docker for AWS 服務,透過 CloudFormation 範本建立多區域的 Docker Swarm 叢集。

連線 Swarm 管理節點

要連線到 Swarm 管理節點,首先需要在本地機器上複製金鑰對 docker.pem。然後,使用管理節點 EC2 例項的公有 IP 地址,以使用者 docker 身份進行 SSH 登入。

ssh -i "docker.pem" docker@54.89.68.201

登入後,可以使用 docker --version 命令檢查 Docker 版本。

~ $ docker --version
Docker version 17.06.0-ce, build 02c1d87

內容解密:

  • ssh -i "docker.pem" docker@54.89.68.201:使用指定的私鑰檔案 docker.pem,以使用者 docker 身份登入到 IP 地址為 54.89.68.201 的 EC2 例項。
  • docker --version:檢查當前 Docker 的版本,確認是否支援 Swarm 模式(Docker 1.12 或更高版本)。

操作 Swarm 叢集

列出 Swarm 叢集中的節點,可以使用 docker node ls 命令。

~ $ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
255llm8729rns82bmloaxs6usl ip-172-31-8-37.ec2.internal Ready Active
ikyskl4ysocymoe4pbrj3qnh3 ip-172-31-4-154.ec2.internal Ready Active Reachable
p2ky6meej8tnph5wyuw59xtmr ip-172-31-21-30.ec2.internal Ready Active Leader
r56kkltfgc4zzzfbslinrun2d1 ip-172-31-24-185.ec2.internal Ready Active
soggz5qplcihk8y2y58uj9md4 ip-172-31-1-33.ec2.internal Ready Active
xbdeo8qp9jhi398h478wl2zrv * ip-172-31-33-35.ec2.internal Ready Active Reachable
ykk4odpjps6t6eqc9mriqvo4a ip-172-31-47-162.ec2.internal Ready Active
zrlrmijyj5vklxl3ag7gayb3w ip-172-31-39-210.ec2.internal Ready Active

內容解密:

  • docker node ls:列出 Swarm 叢集中的所有節點,包括其狀態、可排程性和管理員狀態。
  • Leader 和 Reachable 狀態的節點是管理節點,而 Active 狀態表示節點可用於排程任務。

建立 Docker 服務

可以透過 docker service create 命令建立一個 MySQL 資料函式庫服務。

docker service create \
--env MYSQL_ROOT_PASSWORD='mysql' \
--replicas 1 \
--name mysql \
--update-delay 10s \
--update-parallelism 1 \
mysql

內容解密:

  • docker service create:建立一個新的服務。
  • --env MYSQL_ROOT_PASSWORD='mysql':設定 MySQL root 使用者的密碼。
  • --replicas 1:指定服務的副本數量為 1。
  • --name mysql:命名服務為 mysql
  • --update-delay 10s--update-parallelism 1:控制服務更新的延遲和平行度。

擴充套件服務到三個副本,可以使用 docker service scale 命令。

~ $ docker service scale mysql=3
mysql scaled to 3
~ $ docker service ps mysql
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
slqtuf9l4hxo mysql.1 mysql:latest ip-172-31-35-3.us-east-2.compute.internal Running Running about a minute ago
exqsthrgszzc mysql.2 mysql:latest ip-172-31-27-83.us-east-2.compute.internal Running Preparing 8 seconds ago
vtuhsl6mya85 mysql.3 mysql:latest ip-172-31-29-199.us-east-2.compute.internal Running Preparing 8 seconds ago

內容解密:

  • docker service scale mysql=3:將 mysql 服務擴充套件到三個副本。
  • docker service ps mysql:列出 mysql 服務的所有任務(副本),包括其狀態和執行的節點。

刪除 Swarm 叢集

要刪除 Swarm 叢集,可以在 CloudFormation 控制檯中選擇 Actions > Delete Stack。

此操作將刪除叢集中的所有資源,包括 EC2 例項和 Elastic Load Balancer。

Docker 服務管理:建構高效能分散式應用

Docker 容器包含了執行應用程式所需的所有二進位制檔案和依賴項,使用者只需執行 Docker 容器即可啟動和存取應用程式。CoreOS Linux 作業系統已預先安裝 Docker,無需額外安裝即可使用 Docker 指令。

單一主機的限制

預設情況下,Docker 容器僅在單一節點上啟動。然而,在需要高用性和冗餘的生產環境中,應用程式需要在多個主機上執行。當使用 docker run 指令啟動 Docker 容器時,容器僅在單一主機上啟動,如圖 4-1 所示。

Docker Swarm 模式的優勢

Docker Swarm 模式使 Docker 應用程式能夠跨多個 Docker Engine 節點執行,這些節點透過疊加網路連線,如圖 4-2 所示。Docker 服務可以建立特定數量的副本,每個副本可能執行在叢集中的不同主機上。Swarm 由一個或多個管理節點組成,其中一個節點為長官者,負責 Swarm 管理和協調。工作節點執行實際的服務任務,管理節點預設也可以作為工作節點。Docker 服務只能從長官者節點啟動,因此排程在工作節點上的服務副本能夠執行分散式應用程式。

本章涵蓋內容

本章將討論以下主題:

  • 環境設定
  • Docker 服務指令
  • 服務型別
  • 建立服務
  • 列出服務任務
  • 在命令列上呼叫 Hello World 服務任務
  • 取得服務的詳細資訊
  • 在瀏覽器中呼叫 Hello World 服務
  • 建立 MySQL 資料函式庫服務
  • 縮放服務
  • 更新服務
  • 移除服務

環境設定

首先,建立一個由一個管理節點和兩個工作節點組成的 Docker Swarm。使用 Chapter 3 中討論的程式,先啟動三個 CoreOS 例項,分別作為 Swarm 管理節點和兩個工作節點。取得 Swarm 管理節點的公有 IP 位址,如圖 4-3 所示。

~ $ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
ilru4f0i280w2tlsrg9hglwsj ip-172-31-10-132.ec2.internal Ready Active
w5to186ipblpcq390625wyq2e ip-172-31-37-135.ec2.internal Ready Active
zkxle7kafwcmt1sd93kh5cy5e * ip-172-31-13-155.ec2.internal Ready Active Leader

詳細解說:

此指令用於列出 Swarm 中的所有節點,包括管理節點和工作節點。其中,zkxle7kafwcmt1sd93kh5cy5e 節點是長官者,負責 Swarm 的管理和協調。

Docker 服務指令

Docker 服務指令用於管理 Docker 服務。docker service 指令提供了多個子指令,如表 4-1 所示。要執行 docker service 指令,必須滿足以下要求:

  • Docker Swarm 模式必須啟用
  • docker service 指令必須從 Swarm 管理節點(即長官者)執行

詳細解說:

這些指令只能在 Swarm 模式下使用,不能在 Swarm 模式外執行。同時,也不能從工作節點執行 docker service 指令,因為工作節點不能用於檢視或修改 Swarm 叢集狀態。

docker service 子指令

指令描述
docker service create建立新的服務
docker service inspect顯示一個或多個服務的詳細資訊
docker service logs取得服務的日誌(Docker 17.0.6 新增)
docker service ls列出服務
docker service ps列出一個或多個服務的任務
docker service rm移除一個或多個服務
docker service scale縮放一個或多個複製服務
docker service update更新服務

詳細解說:

每個子指令都有其特定的功能,用於管理和維護 Docker 服務。例如,docker service create 用於建立新的服務,而 docker service inspect 用於顯示服務的詳細資訊。這些指令對於管理和維護分散式應用程式至關重要。

Docker 服務型別與建立

Docker Swarm 模式支援兩種服務型別:複製服務(Replicated Services)與全域服務(Global Services)。全域服務在 Docker Swarm 中的每個節點上執行一個任務,而複製服務則執行設定數量的任務(副本),預設為一個。我們首先建立一個複製服務,然後討論建立全域服務。

建立服務

建立 Docker 服務的命令語法如下:

docker service create [OPTIONS] IMAGE [COMMAND] [ARG...]

部分支援的選項列於下表中。

建立複製服務範例

建立一個名為 hello-world 的服務,使用 Docker 映像 tutum/hello-world,包含兩個副本,並將服務暴露在主機的 8080 連線埠上。

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

輸出結果為服務 ID。

列出服務任務

使用以下命令列出服務任務(在複製服務的上下文中也稱為副本):

docker service ps hello-world

任務列表解說

輸出結果顯示兩個服務任務,包括任務 ID、任務名稱、Docker 映像、節點名稱、期望狀態和當前狀態等資訊。

驗證容器執行狀態

在執行任務的每個節點上,應當執行一個 Docker 容器。可使用 docker ps 命令列出容器。

docker ps

輸出結果顯示正在執行的容器及其相關資訊。

呼叫 Hello World 服務任務

使用 curl 命令呼叫 hello-world 服務,存取 <hostname>:8080,輸出結果為服務的 HTML 標記。

curl ec2-34-200-225-39.compute-1.amazonaws.com:8080

輸出結果為 HTML 內容,包括標題、樣式和主機名稱等資訊。

取得服務詳細資訊

執行 docker service inspect 命令以取得 hello-world 服務的詳細資訊。

docker service inspect hello-world

詳細資訊解說

輸出結果包含容器的詳細設定、資源、重新啟動策略、佈置模式、更新設定、連線埠對應和虛擬 IP 等資訊。

內容解密:

  1. 命令語法與選項:瞭解 docker service create 命令的語法和支援的選項,例如 --replicas--publish 等,用於組態服務的基本屬性。
  2. 複製服務與全域服務:區分複製服務和全域服務的不同特點和適用場景。複製服務適合需要特定數量副本的應用,而全域服務則確保每個節點上都執行一個任務。
  3. 任務管理:使用 docker service ps 命令管理和監控服務任務,包括檢視任務狀態和相關節點資訊。
  4. 容器驗證:透過 docker ps 命令驗證節點上容器的執行狀態,確保服務正常運作。
  5. 服務呼叫與測試:使用 curl 命令測試 hello-world 服務,驗證其功能和可存取性。
  6. 詳細資訊檢查:利用 docker service inspect 命令取得服務的詳細組態和狀態資訊,用於故障排除和最佳化。

Docker 服務管理與操作詳解

Docker Swarm 提供了一系列強大的服務管理功能,能夠讓開發者輕鬆佈署和管理容器化應用。本章節將探討 Docker 服務的建立、擴充套件和管理,涵蓋從簡單的 Hello World 服務到更複雜的 MySQL 資料函式庫服務。

建立 Hello World 服務

首先,我們使用 docker service create 命令建立一個名為 hello-world 的服務,該服務根據 tutum/hello-world 映象。該命令如下:

docker service create --name hello-world --replicas 2 -p 8080:80 tutum/hello-world

內容解密:

  • --name hello-world:指定服務名稱為 hello-world
  • --replicas 2:設定服務的副本數為 2,意味著將啟動兩個相同的容器例項。
  • -p 8080:80:將主機的 8080 埠對映到容器的 80 埠,使得外部可以透過主機的 8080 埠存取服務。
  • tutum/hello-world:指定用於建立服務的 Docker 映象。

檢查服務狀態可以使用 docker service ls 命令,輸出結果顯示了服務的 ID、名稱、模式、副本數和映象等資訊。

檢查服務詳情

使用 docker service inspect 命令可以取得服務的詳細組態資訊,包括其副本數量、更新策略和埠組態等。

{
  "ID": "vyxnpstt3511...",
  "Spec": {
    "Mode": {
      "Replicated": {
        "Replicas": 2
      }
    },
    "UpdateConfig": {
      "Parallelism": 1,
      "FailureAction": "pause"
    },
    "EndpointSpec": {
      "Ports": [
        {
          "Protocol": "tcp",
          "TargetPort": 80,
          "PublishedPort": 8080
        }
      ]
    }
  }
}

內容解密:

  • Replicas: 2:確認服務執行兩個副本。
  • UpdateConfig:定義了更新策略,包括平行更新的數量和失敗時的處理方式。
  • EndpointSpec.Ports:描述了服務的埠對映組態,將容器的 80 埠對映到主機的 8080 埠。

在瀏覽器中呼叫 Hello World 服務

透過 EC2 例項的公共 DNS 和對映的埠(8080),可以在瀏覽器中存取 Hello World 服務,無論是在管理節點還是工作節點上。

建立 MySQL 資料函式庫服務

建立 MySQL 資料函式庫服務與 Hello World 服務有所不同,因為 MySQL 映象需要特定的環境變數(如 MYSQL_ROOT_PASSWORD)。

docker service create \
  --env MYSQL_ROOT_PASSWORD='mysql' \
  --replicas 1 \
  --restart-condition none \
  --restart-max-attempts 5 \
  --update-failure-action continue \
  --name mysql \
  --update-delay 10s \
  mysql

內容解密:

  • --env MYSQL_ROOT_PASSWORD='mysql':設定 MySQL 的 root 密碼。
  • --replicas 1:初始設定一個副本。
  • --restart-condition none:不自動重啟容器。
  • --update-failure-action continue:更新失敗時繼續執行。

縮放服務

使用 docker service scale 命令可以動態調整服務的副本數量,例如,將 MySQL 服務擴充套件到三個副本:

docker service scale mysql=3

執行後,MySQL 服務將執行三個副本,可以透過 docker service ps mysql 檢視各個任務的狀態。

列出服務任務

使用 docker service ps 命令可以檢視特定服務的所有任務,包括其 ID、名稱、節點、期望狀態和當前狀態等。

docker service ps mysql

內容解密:

  • 該命令輸出了 MySQL 服務所有任務的詳細資訊,包括它們執行的節點和當前狀態。

本章節詳細介紹了 Docker Swarm 中服務的建立、管理和擴充套件操作,從簡單的 Hello World 示例到更複雜的 MySQL 資料函式庫服務佈署。透過這些操作,可以有效地管理和協調多個容器化應用,提高應用的可用性和可擴充套件性。