swarm mode 介紹
Docker Swarm 是 Docker 官方容器編排項目之一,提供 Docker 容器集群服務,是 Docker 官方對容器雲生態進行支持的核心方案。
使用它,用戶可以將多個 Docker 主機封裝為單個大型的虛擬 Docker 主機,快速打造一套容器雲平台。
在Docker 1.12.0
之后的版本中,已經將swarm內嵌入docker引擎了,變成了docker的子命令docker swarm
。
swarm mode
內置了KV存儲功能, 提供了眾多的新特性,具有容錯能力的去中心化設計,內置服務發現、負載均衡、路由網絡、動態伸縮、滾動更新、安全傳輸等。
swarm的基本概念
Swarm
是使用 SwarmKit
構建的 Docker 引擎內置(原生)的集群管理和編排工具。
使用 Swarm
集群之前需要了解以下幾個概念。
節點
運行 Docker 的主機可以主動初始化一個 Swarm
集群或者加入一個已存在的 Swarm
集群,這樣這個運行 Docker 的主機就成為一個 Swarm
集群的節點 (node
) 。
節點分為管理 (manager
) 節點和工作 (worker
) 節點。
管理節點用於 Swarm
集群的管理,docker swarm
命令基本只能在管理節點執行(節點退出集群命令 docker swarm leave
可以在工作節點執行)。一個 Swarm
集群可以有多個管理節點,但只有一個管理節點可以成為 leader
,leader
通過 raft
協議實現。
工作節點是任務執行節點,管理節點將服務 (service
) 下發至工作節點執行。管理節點默認也作為工作節點。你也可以通過配置讓服務只運行在管理節點。
來自 Docker 官網的這張圖片形象的展示了集群中管理節點與工作節點的關系。
服務和task
任務 (Task
)是 Swarm
中的最小的調度單位,目前來說就是一個單一的容器。
服務 (Services
) 是指一組任務的集合,服務定義了任務的屬性。服務有兩種模式:
replicated services
按照一定規則在各個工作節點上運行指定個數的任務。global services
每個工作節點上運行一個任務
兩種模式通過 docker service create
的 --mode
參數指定。
來自 Docker 官網的這張圖片形象的展示了容器、任務、服務的關系。
創建swarm集群
通過前面的簡單介紹,我們知道swarm是由管理節點和工作節點組成的,即leader和follower組成,我們選選取一台主機作為swarm的管理節點,在管理節點上執行命令將自己初始化為管理節點(前提是,該主機必須安裝了docker環境),等待其他節點的加入:
[root@node1 ~]# docker swarm init
Swarm initialized: current node (z450zeu3ul9pcggml756lip0w) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-4kuadn332c96u11gojm6575400eh0m2gmsf7r4nkirdy9op0ka-6kblnv1n1thj8hyozo3fax1ri 10.100.1.123:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
從init之后,給出了如何加入的方法。直接在其他節點上執行即可將主機添加到swarm集群中:
[root@node2 ~]# docker swarm join --token SWMTKN-1-4kuadn332c96u11gojm6575400eh0m2gmsf7r4nkirdy9op0ka-6kblnv1n1thj8hyozo3fax1ri 10.100.1.123:2377
This node joined a swarm as a worker.
可以在管理節點查看整個集群的節點信息:
[root@node1 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
tuiqjpehjq9sthd77npydr8qv node2 Ready Active 19.03.2
z450zeu3ul9pcggml756lip0w * node1 Ready Active Leader 19.03.2
在swarm上部署服務
我們使用 docker service
命令來管理 Swarm
集群中的服務,該命令只能在管理節點運行。我們使用 docker service
命令來管理 Swarm
集群中的服務,該命令只能在管理節點運行。
我們在swarm上創建一個nginx服務:
[root@node1 ~]# docker service create --replicas 2 -p 8080:80 --name webnginx nginx
01zq6lp7oyxdgbvw7l34n6j9u
overall progress: 2 out of 2 tasks
1/2: running [==================================================>]
2/2: running [==================================================>]
verify: Service converged
使用 docker service ls
來查看當前 Swarm
集群運行的服務。
[root@node1 ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
01zq6lp7oyxd webnginx replicated 2/2 nginx:latest *:8080->80/tcp
我們分別在管理節點和從節點訪問下8080
端口,然后可以看看日志:
[root@node1 ~]# docker service logs webnginx
webnginx.1.rf2e15kitl28@node1 | 10.255.0.3 - - [17/Oct/2019:05:27:19 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.43.0" "-"
webnginx.2.35miixmebucu@node2 | 10.255.0.2 - - [17/Oct/2019:05:26:29 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.43.0" "-"
swars進行服務伸縮
我們可以使用 docker service scale
對一個服務運行的容器數量進行伸縮。
當業務處於高峰期時,我們需要擴展服務運行的容器數量。
[root@node1 ~]# docker service scale webnginx=5
webnginx scaled to 5
overall progress: 5 out of 5 tasks
1/5: running [==================================================>]
2/5: running [==================================================>]
3/5: running [==================================================>]
4/5: running [==================================================>]
5/5: running [==================================================>]
verify: Service converged
[root@node1 ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
01zq6lp7oyxd webnginx replicated 5/5 nginx:latest *:8080->80/tcp
從上面可以看到副本數量變成了5個。
當業務平穩時,我們需要減少服務運行的容器數量。
[root@node1 ~]# docker service scale webnginx=1
webnginx scaled to 1
overall progress: 1 out of 1 tasks
1/1: running [==================================================>]
verify: Service converged
[root@node1 ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
01zq6lp7oyxd webnginx replicated 1/1 nginx:latest *:8080->80/tcp
刪除swarm啟動的服務,發現容器也銷毀了:
[root@node1 ~]# docker service rm webnginx
webnginx
[root@node1 ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
[root@node1 ~]# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
總結
# 集群管理
docker swarm init
docker swarm join --token <token>
# 節點管理
docker node [options]
# 服務管理
docker service create ...
docker service ls
docker service logs ...
docker service rm ...