Docker Swarm 提供了 Swarm 模式,可將多個 Docker 主機組成叢集,簡化分散式應用程式的佈署和管理。透過資源預留和限制,可以精細控制服務的資源使用,確保叢集穩定執行。服務佈署方面,Swarm 支援複製服務和全域服務,滿足不同應用場景的需求。YAML 檔案格式的服務堆積疊定義,讓複雜的多服務應用程式佈署更加便捷。排程策略則負責最佳化任務分配,並可透過滾動更新機制,在不中斷服務的情況下完成版本升級或設定調整。
使用 Docker Cloud 的 Swarm 模式
Docker Cloud 提供了一個稱為 Swarm 模式的託管服務,用於將 Docker Cloud 託管服務連結到 AWS 服務提供者帳戶並從 Docker Cloud 組態 Swarm。可以在命令列上建立 Swarm 並匯入 Docker Cloud。
將 Swarm 匯入 Docker Cloud
首先,建立一個具有兩個節點的 Swarm,並在 Swarm 管理節點上執行 docker node ls 命令列出節點。
~$ docker node ls
HOSTNAME STATUS AVAILABILITY MANAGER STATUS
trgb2t4ehs2gp3cjbrnqhs7a5 ip-172-31-6-64.us-east-2.compute.internal Ready Active
yl.ic3h3stxo5ztbujtl3yf86p ip-172-31-23-196.us-east-2.compute.internal Ready Active Leader
~$
接下來,從 Swarm 管理節點執行以下命令,將 Swarm 匯入 Docker Cloud。
docker run -ti --rm -v /var/run/docker.sock:/var/run/docker.sock dockercloud/registration
在使用者名稱提示符下指定 Docker ID,在密碼提示符下指定密碼。
內容解密:
此步驟需要使用 dockercloud/registration 映像來註冊 Swarm。該命令會將 Docker 主機的 Docker 通訊端掛載到容器中,以便容器可以存取 Docker 主機的 API。使用 -ti 選項可以讓容器以互動模式執行,而 --rm 選項則會在容器離開後自動刪除它。
輸入 Docker ID 登入憑證後,指定要匯入 Docker Cloud 的 Swarm 的叢集名稱,或使用預設值。指定叢集名稱後,Swarm 就會向 Docker Cloud 註冊。
Enter name for the new cluster [dvohra/wkhøtlq8cw5u44x22qp6r4eau]: dvohra/dockercloudswarm
You can now access this cluster using the following command in any Docker Engine
docker run --rm -ti -v /var/run/docker.sock:/var/run/docker.sock -e DOCKER_HOST dockercloud/client dvohra/dockercloudswarm
內容解密:
此步驟完成了 Swarm 向 Docker Cloud 的註冊。註冊後,可以使用指定的命令從任何 Docker 主機存取叢集。
完成註冊後,點選 Swarm 模式下的「Bring Your Own Swarm」按鈕,將 Swarm 新增到 Docker Cloud。
使用服務堆積疊
Docker Swarm 模式是 Docker 原生的,用於建立分散式和可擴充套件的服務,以開發 Docker 應用程式。大多數 Docker 企業應用程式由多個映像組成,這些映像之間存在依賴關係。
問題
雖然單一 Docker 映像應用程式也很常見,但大多數 Docker 企業應用程式由多個映像組成,這些映像之間存在依賴關係。Docker Compose(獨立的 v1 和 v2)可用於宣告微服務之間的依賴關係,但 Compose(獨立的)在 Swarm 模式服務的背景下已經過時。
解決方案
Docker Swarm 模式引入了服務堆積疊,用於定義一組服務(Swarm 模式服務),這些服務會自動連結在一起,以提供具有依賴關係的服務的邏輯分組。堆積疊使用 YAML 檔案,其格式與 docker-compose.yml 格式非常相似。
使用服務堆積疊的要求
- Docker 版本必須是 1.13 或更高版本。
- 必須啟用 Swarm 模式。
- 堆積疊檔案 YAML 格式必須根據 Docker Compose v3.x 檔案格式。
Docker Compose 版本 3.x 和更高版本與 Docker Swarm 模式完全相容,這意味著可以使用 Docker Compose v3.x docker-compose.yml 檔案作為堆積疊檔案,但有一些子選項(包括 build、container_name、external_links 和 links)在堆積疊檔案中不受支援。
docker stack 命令
| 命令 | 描述 |
|---|---|
| deploy | 部屬一個服務堆積疊或更新現有的堆積疊 |
| ls | 列出堆積疊 |
| ps | 列出堆積疊中的 Swarm 模式任務 |
| rm | 刪除一個堆積疊 |
| services | 列出堆積疊中的 Swarm 模式服務 |
內容解密:
docker stack 命令用於管理服務堆積疊。可以使用 docker stack deploy 命令建立一個服務堆積疊,或使用 docker stack ls 命令列出現有的堆積疊。其他命令可用於管理堆積疊中的服務和任務。
使用服務堆積疊(Service Stacks)
Docker 的服務堆積疊(Service Stacks)是一種管理多個服務的工具,能夠讓開發者輕鬆地佈署和管理複雜的應用程式。本章節將介紹如何使用 Docker 的服務堆積疊功能來佈署一個由 WordPress 和 MySQL 組成的應用程式。
環境設定
首先,我們需要設定一個 Docker Swarm 模式的叢集(cluster)。這可以透過 Docker for AWS 來實作,Docker for AWS 使用 AWS CloudFormation 範本來建立一個 Docker Swarm 模式的叢集。
- 登入 AWS 管理控制檯,並導航到 CloudFormation 頁面。
- 點選「建立堆積疊」按鈕,並選擇「Docker for AWS」範本。
- 組態 Swarm 叢集的引數,包括 Swarm 管理節點(manager node)和工作節點(worker node)的數量。
組態服務堆積疊
在設定好 Swarm 叢集之後,我們可以建立一個服務堆積疊。服務堆積疊是由多個服務組成的,每個服務都執行在一個或多個容器中。
- 首先,我們需要建立一個
docker-cloud.yml檔案,該檔案定義了服務堆積疊的組態。 - 在該檔案中,我們定義了兩個服務:
web和mysql。web服務使用wordpress映象,而mysql服務使用mysql映象。 - 我們還需要設定環境變數,例如
MYSQL_ROOT_PASSWORD,以便 MySQL 映象能夠正常執行。
version: '3'
services:
web:
image: wordpress
environment:
WORDPRESS_DB_HOST: mysql
WORDPRESS_DB_USER: root
WORDPRESS_DB_PASSWORD: ${MYSQL_ROOT_PASSWORD}
ports:
- "80:80"
depends_on:
- mysql
mysql:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
volumes:
- mysql-data:/var/lib/mysql
volumes:
mysql-data:
內容解密:
version: '3'指定了 Docker Compose 檔案的版本。services定義了服務堆積疊中的各個服務。web和mysql是兩個服務,分別使用wordpress和mysql映象。environment用於設定環境變數。depends_on指定了服務之間的依賴關係。
佈署服務堆積疊
在建立好 docker-cloud.yml 檔案之後,我們可以使用 docker stack deploy 命令來佈署服務堆積疊。
docker stack deploy -c docker-cloud.yml my_stack
內容解密:
docker stack deploy命令用於佈署服務堆積疊。-c選項指定了組態檔案。my_stack是服務堆積疊的名稱。
管理服務堆積疊
在佈署好服務堆積疊之後,我們可以使用 docker stack 命令來管理服務堆積疊。
docker stack ls
docker stack ps my_stack
docker stack services my_stack
內容解密:
docker stack ls命令用於列出所有服務堆積疊。docker stack ps命令用於列出指定服務堆積疊中的任務。docker stack services命令用於列出指定服務堆積疊中的服務。
使用服務堆積疊(Service Stacks)
服務堆積疊是 Docker Swarm 模式中的一個重要概念,允許使用者透過單一命令佈署多個服務。本章節將介紹如何使用 Docker Compose YAML 檔案格式建立和佈署服務堆積疊。
建立堆積疊檔案
首先,我們需要建立一個堆積疊檔案,該檔案定義了將要佈署的服務。以下是一個示例 docker-cloud.yml 檔案:
version: '3'
services:
web:
image: wordpress
links:
- mysql
environment:
- WORDPRESS_DB_PASSWORD="mysql"
ports:
- "8080:80"
mysql:
image: mysql:latest
environment:
- MYSQL_ROOT_PASSWORD="mysql"
- MYSQL_DATABASE="mysqldb"
該檔案定義了兩個服務:web 和 mysql。web 服務使用 wordpress 映象,並將容器埠 80 對應到主機埠 8080。mysql 服務使用 mysql:latest 映象。
內容解密:
version: '3'指定了 Docker Compose 檔案格式的版本。services定義了將要佈署的服務。image指定了服務使用的 Docker 映象。links定義了服務之間的連線,但此選項在 Swarm 模式中不被支援,將被忽略。environment定義了服務的環境變數。ports定義了容器埠與主機埠的對映。
建立堆積疊
使用 docker stack deploy 命令建立和佈署堆積疊。語法如下:
docker stack deploy [OPTIONS] STACK
其中,STACK 是堆積疊的名稱。
內容解密:
--compose-file, -c指定了堆積疊檔案的路徑。--with-registry-auth指定是否將登入檔的身份驗證資訊傳送給 Swarm 代理。
使用以下命令建立一個名為 mysql 的堆積疊:
docker stack deploy --compose-file docker-cloud.yml mysql
該命令將建立一個堆積疊,並佈署 web 和 mysql 服務。
列出堆積疊
使用 docker stack ls 命令列出所有堆積疊:
docker stack ls
該命令將顯示所有堆積疊的名稱和服務數量。
列出服務
使用 docker stack services 命令列出堆積疊中的服務:
docker stack services mysql
該命令將顯示 mysql 堆積疊中的所有服務,包括服務名稱、模式、副本數量和使用的映象。
內容解密:
--filter, -f可以用於過濾服務。--quiet, -q可以用於僅顯示服務 ID。
列出容器
使用 docker stack ps 命令列出堆積疊中的容器:
docker stack ps mysql
該命令將顯示 mysql 堆積疊中的所有容器,包括容器 ID、名稱、映象、節點、期望狀態和當前狀態。
內容解密:
--filter, -f可以用於過濾容器。--no-resolve可以用於不解析容器 ID 為名稱。--no-trunc可以用於不截斷輸出。
使用服務堆積疊
現在,我們可以使用 web 服務來建立一個 WordPress 網站。首先,取得 Swarm 管理節點的公共 DNS 名稱,然後在瀏覽器中開啟 <public dns>:8080 URL。按照 WordPress 的安裝步驟完成安裝。
此時,我們已經成功地使用 Docker Swarm 模式佈署了一個 WordPress 網站。該網站使用了 web 和 mysql 兩個服務,並透過 Docker Compose YAML 檔案格式定義了服務的組態和依賴關係。
使用服務堆積疊(Service Stacks)
服務堆積疊是Docker原生功能的一部分,自Docker 1.13版本開始引入。它是一種將相關服務集合在一起的方法,並透過堆積疊檔案進行定義,該檔案採用與Docker Compose v3.x相似的YAML語法格式撰寫。
佈署WordPress服務堆積疊
安裝WordPress:首先,確保WordPress已經成功安裝,如圖15-10所示。點選“登入”按鈕進行登入操作。
登入WordPress:輸入使用者名稱和密碼,並點選“登入”按鈕,如圖15-11所示。
存取WordPress儀錶板:成功登入後,將顯示WordPress部落格儀錶板,如圖15-12所示。選擇“文章”並點選“新增文章”,如圖15-13所示。
新增文章:在“新增文章”對話方塊中,輸入標題並新增部落格內容。點選“發布”按鈕,如圖15-14所示。新文章將被新增,點選“檢視文章”按鈕,如圖15-15所示,以顯示該文章。
檢視文章與新增評論:文章將被顯示,如圖15-16所示。向下滾動並新增評論,如圖15-17所示。評論被成功新增後,如圖15-18所示。
移除服務堆積疊
使用docker stack rm STACK命令可以移除指定的堆積疊。例如,要移除名為mysql的堆積疊,可以執行以下命令:
docker stack rm mysql
執行後,mysql堆積疊將被移除,使用docker stack service mysql命令將不再列出任何服務。
內容解密:
本章節主要講解了Docker服務堆積疊的使用,包括如何佈署WordPress服務堆積疊以及如何移除服務堆積疊。其中,重點介紹了使用docker stack命令來管理堆積疊,以及如何透過YAML檔案定義堆積疊組態。
重點回顧
- 服務堆積疊是Docker原生功能,用於管理和佈署多個相關服務。
- 使用
docker stack deploy命令可以根據YAML檔案建立或更新堆積疊。 - 使用
docker stack rm命令可以移除指定的堆積疊。 - YAML檔案採用與Docker Compose v3.x相似的語法格式,用於定義堆積疊組態。
技術深度解析
服務堆積疊的引入,使得Docker應用的管理和佈署變得更加簡單和高效。透過定義清晰的YAML檔案,可以確保服務的一致性和可重複性。同時,Docker提供的命令列工具,使得對堆積疊的管理變得直觀和方便。
未來趨勢預測
隨著Docker的不斷發展,服務堆積疊功能將會變得更加強大和完善。未來的版本可能會引入更多的新特性,例如增強的安全性、更靈活的組態選項等,以滿足不斷變化的應用需求。
實務應用評估
在實際應用中,服務堆積疊可以大大簡化複雜應用的佈署和管理工作。特別是在微服務架構中,透過使用服務堆積疊,可以輕鬆地管理和協調多個微服務,提高應用的可維護性和可擴充套件性。
Docker Swarm 深入解析:資源管理與服務佈署
Docker Swarm 是 Docker 的原生叢集管理工具,能夠將多個 Docker 主機整合成一個虛擬的 Docker 主機。在本篇文章中,我們將探討 Docker Swarm 的資源管理、服務佈署以及相關的排程策略。
資源管理
在 Docker Swarm 中,資源管理是確保服務高效執行的關鍵。資源包括 CPU、記憶體等計算資源,以及儲存卷等其他資源。
資源預留與限制
資源預留(Resource Reserves)是指為服務預留的資源量,確保服務在執行時能夠獲得足夠的資源。資源限制(Resource Limits)則是指服務能夠使用的最大資源量,防止服務佔用過多資源影響其他服務的執行。
docker service create --name mysql \
--reserve-memory 1G \
--limit-memory 2G \
mysql:latest
內容解密:
--reserve-memory 1G:為 mysql 服務預留 1GB 的記憶體。--limit-memory 2G:限制 mysql 服務最多使用 2GB 的記憶體。
服務佈署
Docker Swarm 提供了靈活的服務佈署方式,包括複製服務(Replicated Services)和全域服務(Global Services)。
複製服務
複製服務是指在叢集中執行多個相同的任務例項,可以根據需要進行擴充套件或縮減。
docker service create --name nginx \
--replicas 3 \
nginx:latest
內容解密:
--replicas 3:啟動 3 個 nginx 服務例項。
全域服務
全域服務是指在叢集中的每個節點上執行一個任務例項,適合需要每個節點都執行的任務。
docker service create --name sematext-agent \
--mode global \
sematext/docker-agent
內容解密:
--mode global:將 sematext-agent 服務以全域模式佈署到每個節點。
排程策略
Docker Swarm 使用排程策略來決定在哪些節點上執行任務。預設的排程策略是 Spread Scheduling Strategy,即盡量將任務分散到不同的節點上,以實作資源的均衡利用。
Spread Scheduling Strategy
Spread Scheduling Strategy 的目標是最大限度地利用叢集資源,避免單個節點過載。
docker service create --name mysql \
--replicas 3 \
--constraint 'node.role==worker' \
mysql:latest
內容解密:
--constraint 'node.role==worker':限制 mysql 服務只能在 worker 節點上執行。
更新與回復
Docker Swarm 支援滾動更新(Rolling Update),可以在不中斷服務的情況下更新服務組態或映像版本。
docker service update --image mysql:5.7 \
--update-parallelism 1 \
--update-delay 10s \
mysql
內容解密:
--image mysql:5.7:將 mysql 服務的映像更新為 mysql:5.7。--update-parallelism 1:每次更新一個任務。--update-delay 10s:每次更新之間延遲 10 秒。