最近都在忙,久不更新博客了,今天更新下Docker swarm集羣和集羣容錯測試:
1、如下拓撲:
2、環境說明:
Master/nfs服務器:192.168.63.217 Worker:192.168.63.217 Worker:192.168.63.216
3、創建一個nfs掛載目錄,用於存放wordpress代碼(63.217):
[root@master ~]#yum install -y nfs-utils [root@master ~]## cat /etc/exports /web 192.168.63.0/24(rw,sync,fsid=0) [root@master ~]#systemctl enable rpcbind.service [root@master ~]#systemctl enable nfs-server.service [root@master ~]#systemctl start rpcbind.service [root@master ~]#systemctl start nfs-server.service
4、掛載/web目錄(worker):
[root@node2 ~]#yum install -y nfs-utils [root@node2 ~]#systemctl enable rpcbind.service [root@node2 ~]#systemctl start rpcbind.service [root@webstatus ~]# mount192.168.63.217:/web /web ##掛載之後上傳wordpress代碼
5、把我們在Dockerfile構建的鏡像推送到本地倉庫(這一塊可以參考之前的博客,Dockerfile章節)
[root@masterwordpress]# docker image tag lnmp/php:1.0 192.168.63.217:5000/lnmp/php:1.0 [root@masterwordpress]# docker image tag lnmp/nginx:1.0 192.168.63.217:5000/lnmp/nginx:1.0 [root@masterwordpress]# docker image tag lnmp/mysql:1.0 192.168.63.217:5000/lnmp/mysql:1.0 [root@master wordpress]# docker push192.168.63.217:5000/lnmp/php:1.0 [root@master wordpress]# docker push192.168.63.217:5000/lnmp/nginx:1.0 [root@master wordpress]# docker push192.168.63.217:5000/lnmp/mysql:1.0
##爲了worker節點下載速度快點,我們建議先docker pull到本地
6、構建Docker swarm集羣63.217操作:
[root@master~]# docker swarm init --advertise-addr 192.168.63.217 To add a worker to this swarm, run the following command: docker swarm join \ --tokenSWMTKN-1-37fe5tarzcy50mazbe1e3ewyblkfk7xf9kx9ncanz0wx3q70e1-a7wn9tiepd114if6smuiqlez3\ 192.168.63.217:2377
##在worker節點上面操作,加入這個集羣:
[root@node2 ~]#docker swarm join --token SWMTKN-1-37fe5tarzcy50mazbe1e3ewyblkfk7xf9kx9ncanz0wx3q70e1-a7wn9tiepd114if6smuiqlez3 192.168.63.217:2377
7、查看集羣的節點狀態:
[root@master wordpress]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS e9naz0ctzaaer4bwleruo34x6 * master Ready Active Leader rfcbavxd8yrixximm9e1i6dsn node1 Ready Active shrzku0k3xx87526lkkkyrxsi node2 Ready Active
8、爲了使得Docker swarm集羣容器互相通訊,我們先創建一個overlay網絡:
[root@master docker]# docker network create --driver overlaynginx_network
##注意內核版本要3.18以上,不夠的話要升級
9、隨機創建調度一個9000端口的Php service運行Docker容器:
[root@masterwordpress]# docker service create --mount type=bind,source=/web/,target=/web/--network nginx_network --name php -p 9000:9000192.168.63.217:5000/lnmp/php:1.0 [root@masterwordpress]# docker service ls ID NAME MODE REPLICAS IMAGE ira3ezabroai php replicated 1/1 192.168.63.217:5000/lnmp/php:1.0
10、啓動nginx service:
[root@masterwordpress]#docker service create --mount type=bind,source=/web/,target=/web/ --network nginx_network --name web -p 80:80 192.168.63.217:5000/lnmp/nginx:1.0
11、再啓動mysql service:
[root@masterwordpress]# docker service create --mounttype=bind,source=/data/,target=/var/lib/mysql/ --network nginx_network --namemysql -p 3306:3306 192.168.63.217:5000/lnmp/mysql:1.0
12、我們也可以在複製出一個web service:
[root@master wordpress]# docker servicescale web=2 web scaled to 2
13、看一下我們的容器到底運行在哪個linux主機上呢:
[root@master wordpress]# docker service ls ID NAME MODE REPLICAS IMAGE ira3ezabroai php replicated 1/1 192.168.63.217:5000/lnmp/php:1.0 kcxqzxwe0dzb mysql replicated 1/1 192.168.63.217:5000/lnmp/mysql:1.0 ufn1n5phtsqn web replicated 2/2 192.168.63.217:5000/lnmp/nginx:1.0
#####
[root@master wordpress]# docker service ps php ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS ptxokpvq1b7s php.1 192.168.63.217:5000/lnmp/php:1.0 master Running Running 5 minutes ago [root@master wordpress]# docker service ps mysql ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS zowbxqnr9toi mysql.1 192.168.63.217:5000/lnmp/mysql:1.0 node2 Running Running 2 minutes ago [root@master wordpress]# docker service ps web ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS vhk44hij7gnu web.1 192.168.63.217:5000/lnmp/nginx:1.0 node1 Running Running 3 minutes ago u1vdnr0ujzl7 web.2 192.168.63.217:5000/lnmp/nginx:1.0 node2 Running Running about a minute ago
14、我們已經確認所有的容器都已經起起來並且正常運行了,訪問一下web就可以進行80端口的訪問了,192.168.63.217:
###
####直接到安裝完成:
15、爲了測試高可用性,我們把node1節點關閉掉,看容器是否轉移:
我們在node1執行關閉docker:
[root@node1 web]# systemctl stop docker
16、在master節點上查看一下狀態:
[root@master web]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS e9naz0ctzaaer4bwleruo34x6 * master Ready Active Leader rfcbavxd8yrixximm9e1i6dsn node1 Down Active shrzku0k3xx87526lkkkyrxsi node2 Ready Active
17、我們可以看到node1節點已經Down,然後我們的Docker 容器也已經轉移到了別的worker節點上:
[root@master web]# docker service ps php ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS ptxokpvq1b7s php.1 192.168.63.217:5000/lnmp/php:1.0 master Running Running 18 minutes ago [root@master web]# docker service ps mysql ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS zowbxqnr9toi mysql.1 192.168.63.217:5000/lnmp/mysql:1.0 node2 Running Running 15 minutes ago [root@master web]# docker service ps web ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS jqcuqzjdgi9y web.1 192.168.63.217:5000/lnmp/nginx:1.0 master Running Running 2 minutes ago vhk44hij7gnu \_web.1 192.168.63.217:5000/lnmp/nginx:1.0 node1 Shutdown Running 2 minutes ago u1vdnr0ujzl7 web.2 192.168.63.217:5000/lnmp/nginx:1.0 node2 Running Running 14 minutes ago
##我們可以看到在node1節點上之前運行的容器已經shutdown了,然後轉移到了master和node2上,再次訪問也是不影響的:
##到處已經完成了,我們可以看到通過Docker swarm構建集羣是非常簡單的,那麼有沒有compose可以結合swarm呢?在compose v3版本之後就體現了這個功能的強大。
Docker詳情與集羣架構部分可以查看http://www.roncoo.com/course/view/3e9d9c48f76f4c698b8349d04b763467