1. 程式人生 > >Docker環境下的前後端分離專案部署與運維(十一)Docker Swarm技術

Docker環境下的前後端分離專案部署與運維(十一)Docker Swarm技術

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