6.1 Docker Swarm
的基本概念
Docker Swarm
是 Docker 提供的一個內建的容器調度系統。它可以讓你建立、管理和擴展 Docker 主機的叢集,把它們轉變成一個單一的邏輯主機,在這個主機上可以運行容器。Swarm 會自動在節點之間分配任務,提供了便利性與容錯性。在這堂課裡,我們會探討主要組件和管理 Docker Swarm
所需的基本指令。
Docker Swarm
的基本概念:
- 叢集 (Swarm): 一組整合成單一邏輯叢集的 Docker 主機。
- 管理節點 (Managers): 負責管理叢集並分配任務給工作節點的節點。
- 工作節點 (Workers): 運行任務並啟動容器的節點。
- 服務 (Services): 一種對應程式的邏輯概念,描述需要完成什麼任務以及應該啟動多少容器實例。
- 任務 (Tasks): 是服務的實例化容器,為單一容器單位。
Docker Swarm
的架構:
Docker Swarm 採用了基於管理節點和工作節點的架構。管理節點管理叢集的狀態,而工作節點執行分配的任務。
管理節點:
- 管理叢集的狀態和組態。
- 在工作節點之間分配任務。
- 提供容錯性和高可用性(擁有多個管理節點時)。
工作節點:
- 執行由管理節點指定的任務。
- 根據任務啟動容器。
Docker Swarm
的基本指令:
-
docker swarm init
: 初始化一個新的 Swarm 叢集。 -
docker swarm join
: 加入現有的叢集。 -
docker node ls
: 查看叢集中的節點列表。 -
docker service create
: 建立一個新的服務。 -
docker service ls
: 查看已啟動的服務。 -
docker service scale
: 調整服務至特定數量的實例。 -
docker service rm
: 從叢集中刪除服務。
使用 Docker Swarm
可以簡化分散式系統中應用程式的管理,提供容錯性、可擴展性以及便捷的部署方式。
6.2 建立 Docker Swarm
集群
建立並管理 Docker Swarm 集群
步驟 1: 初始化集群
在第一個主機(manager)執行下面的指令:
docker swarm init --advertise-addr <MANAGER_IPl>
這個指令會初始化一個新的 Swarm 集群,將當前節點設為 manager,並輸出加入 worker 節點的命令。
步驟 2: 加入 worker 節點
在其他主機執行 docker swarm init
命令時輸出的指令,將它們加入集群:
docker swarm join --token <SWARM_TOKEN> <MANAGER_IP>:2377
其中:
<SWARM_TOKEN>
: 連接到集群的 token(由docker swarm init
命令生成)。<MANAGER_IP>
: manager 節點的 IP 位址。
步驟 3: 檢視節點
要檢視集群中的所有節點,可以使用這個命令:
docker node ls
這個命令會顯示所有節點的清單,包括它們的角色、狀態和可用性。
docker node ls
命令的輸出範例
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
qwertyuiop12345 manager-node Ready Active Leader
asdfghjkl67890 worker-node1 Ready Active
zxcvbnm09876 worker-node2 Ready Active
欄位解釋:
- ID: 節點的唯一識別碼。
- HOSTNAME: 運行節點的主機名。
- STATUS: 節點的當前狀態(例如 Ready)。
- AVAILABILITY: 節點的可用性(例如 Active)。
- MANAGER STATUS: 顯示節點是否為 manager(例如 Leader, Reachable)或 worker(空白)。
現在 Docker Swarm 集群已經配置完成,你可以開始建立和擴展應用程式了。
6.3 管理 Docker Swarm
管理 Docker Swarm
中的服務
1. 創建服務
創建一個具有指定副本數量的服務:
docker service create --name my_web --replicas 3 -p 8080:80 nginx
在這個範例中,創建了一個名為 my_web
的服務,啟動了 3 個 Nginx 實例。容器將埠 80 曝光為主機的埠 8080。
2. 查看服務
要查看叢集中所有運行中的服務,請使用以下指令:
docker service ls
指令 docker service ls
的輸出範例
ID NAME MODE REPLICAS IMAGE
ab12345 my_web replicated 3/3 nginx:latest
3. 服務擴展
為更改服務的實例(副本)數量,請使用指令 docker service scale
:
docker service scale my_web=5
現在服務 my_web
將有 5 個實例。
4. 更新服務
要更新服務映像到新版本,請使用指令 docker service update
:
docker service update --image nginx:latest my_web
確保高可用性
Docker Swarm 通過以下方式支持高可用性:
- 任務分配:在叢集節點之間分配任務,以在故障時自動恢復容器。
- 支持多個管理者:建議使用奇數數量的管理者(例如 3 或 5),以避免共識問題。
- 使用副本:為每個服務設置多個副本,以提高容錯能力。
共識的概念
共識是一種大多數節點同意某個操作(例如數據寫入或領袖選舉)的概念,該操作才能被認為是有效的。例如,在一個由 5 個節點組成的叢集中,共識需要至少 3 個節點。
有用的建議!
確保管理者分佈在不同的實體或雲服務伺服器上,以最大限度地減少同時發生故障的風險。
6.4 Docker Compose
配置範例用於 Docker Swarm
Docker Compose
可以和 Docker Swarm
一起使用以簡化多容器應用程序的管理。
docker-compose.yml
文件的示例
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "8080-8090:80"
deploy:
replicas: 3
restart_policy:
condition: on-failure
networks:
- my_overlay_network
db:
image: postgres:latest
environment:
POSTGRES_PASSWORD: example
deploy:
replicas: 1
restart_policy:
condition: on-failure
networks:
- my_overlay_network
networks:
my_overlay_network:
driver: overlay
在 Swarm
中啟動 Docker Compose
堆棧
要在 Docker Swarm
中部署堆棧,使用以下命令:
docker stack deploy -c docker-compose.yml mystack
查看堆棧
查看已部署的堆棧:
docker stack ls
查看堆棧中的服務
docker stack services mystack
GO TO FULL VERSION