Docker Swarm技術
docker swarm技術(之前的docker集群都是在 一個虛擬主機上的,但是如果這個主機掛掉了over了,docker技術就是多個虛擬主機形成一個集群)
Swarm是Docker的一個編排工具,參考官網:https://docs.docker.com/engine/swarm/
- 與docker集成的集群管理工具
- 去中心化設計,只使用docker引擎即可創建各類節點
- 聲明式服務模型。可以聲明的方式來定義應用。
- 動態伸縮。管理節點自動調整服務數量。
- 高可用,對於服務期望狀態做到動態調整,swarm的管理節點會持續監控集群狀態,集群中有沒有達到期望狀態的服務,管理節點會自動調度來達到期望狀態。
- 自定義網絡。可以為你的服務指定一個網絡,容器創建的時候分配一個IP
- 服務發現。管理節點給集群中每個服務一個特定的DNS名字,並給運行的容器提供負載均衡。
- 負載均衡。你可以暴露服務端口給外部的負載均衡。內部swarm提供可配置的容器分配到節點的策略。
- 默認的安全機制。swarm集群中各個節點強制TLS協議驗證。連接加密,你可以自定義根證書。
-
滾動更新。增量跟新,可以自定義更新下個節點的時間間隔,如果有問題,可以會滾到上個版本。
去中心化設計
創建Swarm集群
docker swarm init --listen-addr ip:port 管理者節點 --advertise-addr ip 廣播地址
加入Swarm集群
docker swarm join-token manager
docker swarm join-token worker
示例
# 創建4個服務器虛擬機 # -- 192.168.103.210(manager) # -- 192.168.103.240(manager) # -- 192.168.103.212(worker) # -- 192.168.103.213(worker) # 192.168.103.210進行操作 docker swarm init # 生成加入manager語句,生成的語句在240上面執行 docker swarm join-token manager # 生成加入worker語句,生成的語句在212、213上面執行 docker swarm join-token worker
查看Swarm集群節點
注意:只能在manager節點執行
docker node ls
[root@localhost ~]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION 0l944rsrwj0sqva0pf4shshd1 * localhost Ready Active Leader 18.09.6 askvrplj3p0vh3bh22oi9mr2u localhost Ready Active 18.09.6 g2q35fckeubv0u87y6ol4zw5q localhost Ready Active Reachable 18.09.6 wdxxxyxjvnm9kl757k57dnuwi localhost Ready Active 18.09.6
查看Swarm集群網絡
docker network ls
注意:這個ingress swarm網絡不是用來做容器之間業務通信的,而是用來管理集群的
創建共享網絡
ingress網絡用於管理Swarm集群,所以我們需要創建新的共享網絡
docker network create -d overlay --attachable swarm_test
創建Percona集群示例
演示4台服務器創建5節點集群
# -- 192.168.103.210(manager) # 拉取鏡像 docker pull percona/percona-xtradb-cluster:5.7.21 # 鏡像重命名 docker tag percona/percona-xtradb-cluster:5.7.21 pxc docker rmi percona/percona-xtradb-cluster:5.7.21 # 創建數據卷v1和backup docker volume create v1 docker volume create backup # 創建容器 # 創建5個PXC容器構成集群 # 第一個節點 docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -v v1:/var/lib/mysql -v backup:/data --privileged --name=node1 --net=swarm_test pxc # 創建數據卷v2 docker volume create v2 # 第二個節點 docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v2:/var/lib/mysql -v backup:/data --privileged --name=node2 --net=swarm_test pxc # -- 192.168.103.240(manager) # 拉取鏡像 docker pull percona/percona-xtradb-cluster:5.7.21 # 鏡像重命名 docker tag percona/percona-xtradb-cluster:5.7.21 pxc docker rmi percona/percona-xtradb-cluster:5.7.21 # 創建數據卷v3和backup docker volume create v3 docker volume create backup # 第三個節點 docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v3:/var/lib/mysql -v backup:/data --privileged --name=node3 --net=swarm_test pxc # -- 192.168.103.212(worker) # 拉取鏡像 docker pull percona/percona-xtradb-cluster:5.7.21 # 鏡像重命名 docker tag percona/percona-xtradb-cluster:5.7.21 pxc docker rmi percona/percona-xtradb-cluster:5.7.21 # 創建數據卷v4和backup docker volume create v4 docker volume create backup # 第四個節點 docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v4:/var/lib/mysql -v backup:/data --privileged --name=node4 --net=swarm_test pxc # -- 192.168.103.213(worker) # 拉取鏡像 docker pull percona/percona-xtradb-cluster:5.7.21 # 鏡像重命名 docker tag percona/percona-xtradb-cluster:5.7.21 pxc docker rmi percona/percona-xtradb-cluster:5.7.21 # 創建數據卷v5和backup docker volume create v5 docker volume create backup # 第五個節點 docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v5:/var/lib/mysql -v backup:/data --privileged --name=node5 --net=swarm_test pxc
創建完成后每個節點都應該可以訪問,而且會數據同步
容器集群
容器集群不適合有狀態程序,例如數據庫、緩存等等
退出Swarm集群
- 主動退出
docker swarm leave --force # Manager退出集群必須要使用--force參數
-
被動退出
# Manager被動退出集群 # Manager節點降級為Worker節點 docker node demote <ID> # 刪除停止或離開的Worker節點 docker node rm <ID> # 刪除任何的節點必須要先停止它的Docker服務 # Manager節點必須先降級成Worker節點,然后再去刪除