Docker環境下的前後端分離專案部署與運維(十一)Docker Swarm技術
阿新 • • 發佈:2019-06-28
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節點,然後再去刪除
&n