博文大綱
1、Docker swarm簡介
2、環境準備
3、初始化Swarm羣集
4、配置node0二、node03加入、離開swarm羣集
5、部署圖形化UI
6、docker swarm羣集的service服務配置
7、實現service的擴容、收縮
8、docker Swarm羣集經常使用命令
9、docker swarm總結node
Docker swarm與docker-compose同樣,都是docker官方推出的docker容器的編排工具。但不一樣的是,Docker Compose 是一個在單個服務器或主機上建立多個容器的工具,而 Docker Swarm 則能夠在多個服務器或主機上建立容器集羣服務,對於微服務的部署,顯然 Docker Swarm 會更加適合。linux
Docker swarm:其做用就是把若干個Docker主機抽象爲一個總體,而且經過一個入口統一管理這些Docker主機上的各類Docker資源。Swarm和Kubernetes比較相似,可是更加輕,具備的功能也較kubernetes更少一些。nginx
從 Docker 1.12.0 版本開始,Docker Swarm 已經包含在 Docker 引擎中(docker swarm),而且已經內置了服務發現工具,咱們就不須要像以前同樣,再配置 Etcd 或者 Consul 來進行服務發現配置了。web
Docker swarm中有三種角色:算法
- Manager node:負責執行容器的編排和集羣的管理工做,保持並維護swarm處於指望的狀態,swarm能夠有多個manager node,他們會自動協商選舉出一個leader執行編排任務;但相反,不能沒有manager node;
- Worker node:接受並執行由manager node派發的任務,而且默認manager node也是一個work node,不過能夠將它設置manager-only node,讓它負責編排和管理工做;
- Service:用來定義worker上執行的命令;
注意:在一個Docker Swarm羣集中,每臺docker服務器的角色能夠都是manager,可是,不能夠都是worker,也就是說,不能夠羣龍無首,而且,參與羣集的全部主機名,千萬不能夠衝突。docker
注意事項:瀏覽器
[root@node01 ~]# tail -3 /etc/hosts 192.168.1.1 node01 192.168.1.2 node02 192.168.1.3 node03 //三臺主機都需配置hosts文件實現域名解析的效果 [root@node01 ~]# docker swarm init --advertise-addr 192.168.1.1 //--advertise-addr:指定與其餘node通訊的地址
命令的返回信息,如圖:
圖中①的命令:以worker身份加入swarm羣集中;
②的命令:以manager身份加入swarm羣集中;
出現上圖表示初始化成功!注意:--token表示期限爲24小時;服務器
###################node02的操做以下################### [root@node02 ~]# docker swarm join --token SWMTKN-1-4pc1gjwjrp9h4dny52j58m0lclq88ngovis0w3rinjd05lklu5-ay18vjhwu7w8gsqvct84fv8ic 192.168.1.1:2377 ###################node03的操做以下################### [root@node03 ~]# docker swarm join --token SWMTKN-1-4pc1gjwjrp9h4dny52j58m0lclq88ngovis0w3rinjd05lklu5-ay18vjhwu7w8gsqvct84fv8ic 192.168.1.1:2377 //node0二、node03默認是以worker身份加入的 ###################node01的操做以下################### [root@node01 ~]# docker node ls //查看節點詳細信息(只能是manager身份纔可查看) ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION mc3xn4az2r6set3al79nqss7x * node01 Ready Active Leader 18.09.0 olxd9qi9vs5dzes9iicl170ob node02 Ready Active 18.09.0 i1uee68sxt2puzd5dx3qnm9ck node03 Ready Active 18.09.0 //能夠看出node0一、node0二、node03的狀態爲Active ###################node02的操做以下################### [root@node02 ~]# docker swarm leave ###################node03的操做以下################### [root@node03 ~]# docker swarm leave //node0二、node03申請離開羣集 ###################node01的操做以下################### [root@node01 ~]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION mc3xn4az2r6set3al79nqss7x * node01 Ready Active Leader 18.09.0 olxd9qi9vs5dzes9iicl170ob node02 Down Active 18.09.0 i1uee68sxt2puzd5dx3qnm9ck node03 Down Active 18.09.0 ///能夠看到node0二、node03的狀態爲Down [root@node01 ~]# docker node rm node02 [root@node01 ~]# docker node rm node03 //node01將node0二、node03移除羣集
以上命令能夠將某一個節點加入、刪除羣集,不過加入時是使用worker身份的,若是想要讓節點是以manager身份加入羣集,須要使用如下命令:tcp
[root@node01 ~]# docker swarm join-token manager //查詢以manager身份加入羣集的命令 [root@node01 ~]# docker swarm join-token worker //查詢以worker身份加入羣集的命令
如圖:ide
###################node02的操做以下################### [root@node02 ~]# docker swarm join --token SWMTKN-1-2c0gcpxihwklx466296l5jp6od31pshm04q990n3ssncby3h0c-78rnxee2e990axj0q7td74zod 192.168.1.1:2377 ###################node03的操做以下################### [root@node03 ~]# docker swarm join --token SWMTKN-1-2c0gcpxihwklx466296l5jp6od31pshm04q990n3ssncby3h0c-78rnxee2e990axj0q7td74zod 192.168.1.1:2377 //node0二、node03加入羣集是以manager身份加入 ###################node01的操做以下################### [root@node01 ~]# docker node ls //查看節點的詳細信息 ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION exr8uoww0eih43iujqz5cbv6q * node01 Ready Active Leader 18.09.0 r35f48huyw5hvnkuzatrftj1r node02 Ready Active Reachable 18.09.0 gsg1irl1bywgdsmfawi9rna7p node03 Ready Active Reachable 18.09.0 //從MANAGER STATUS這列就可看出
雖然加入羣集時,能夠指定使用manager、worker身份,可是也能夠經過如下命令,進行降級、升級,操做以下:
[root@node01 ~]# docker node demote node02 [root@node01 ~]# docker node demote node03 //將node0二、node03降級爲worker [root@node01 ~]# docker node promote node02 [root@node01 ~]# docker node promote node03 //將node0二、node03升級爲manager //自行驗證
部署圖形化UI界面由node01來完成!
[root@node01 ~]# docker run -d -p 8080:8080 -e HOST=172.16.0.10 -e PORT=8080 -v /var/run/docker.sock:/var/run/docker.sock --name visualizer dockersamples/visualizer //-e HOST指定的是容器
使用瀏覽器訪問:
瀏覽器能夠正常訪問,則表示圖形化UI界面部署完成!
node01發佈一個任務,(必須在manager角色的主機上)運行六個容器,命令以下:
[root@node01 ~]# docker service create --replicas 6 --name web -p 80:80 nginx // --replicas:副本數量;大概能夠理解爲一個副本就是一個容器
容器運行完成後,能夠登陸web頁面進行查看,如圖:
注意:若是另外兩臺節點服務器上沒有相應的驚醒,則默認會從docker Hub上自動進行下載!
[root@node01 ~]# docker service ls //查看建立的service ID NAME MODE REPLICAS IMAGE PORTS nbfzxltrcbsk web replicated 6/6 nginx:latest *:80->80/tcp [root@node01 ~]# docker service ps web //查看建立的service都運行在那些容器上 ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS v7pmu1waa2ua web.1 nginx:latest node01 Running Running 6 minutes ago l112ggmp7lxn web.2 nginx:latest node02 Running Running 5 minutes ago prw6hyizltmx web.3 nginx:latest node03 Running Running 5 minutes ago vg38mso99cm1 web.4 nginx:latest node01 Running Running 6 minutes ago v1mb0mvtz55m web.5 nginx:latest node02 Running Running 5 minutes ago 80zq8f8252bj web.6 nginx:latest node03 Running Running 5 minutes ago
若是如今node0二、node03發生宕機時,service並不會由於節點的立即而死掉,而是自動跑到正常的節點上。
模擬node02宕機,web頁面以下:
恢復node02,web頁面以下:
即便node02恢復正常,也不會將service分配給node02。
所以,能夠得出一個結論:若是node發生故障,service會自動跑到可用的節點上;反之,若是node沒有發生故障,默認狀況下,service不會輕易更改節點!
擴容:就i是添加幾臺service;
收縮:就是減小几臺service;
針對上述環境實現收縮、擴容;
[root@node01 ~]# docker service scale web=8 //本來有6個service,如今增長到8臺
web頁面以下:
關於service分配到那臺node節點上,是根據docker swarm自身的算法進行分配的。
[root@node01 ~]# docker service scale web=4 //本來有8個service,如今減小到4臺
web頁面以下:
上述環境中,三臺都是manager,即便是一臺manager、兩臺worker默認狀況manager也是進行工做的,將node0二、node03降級爲worker,執行以下命令:
[root@node01 ~]# docker node demote node02 [root@node01 ~]# docker node demote node03
如圖:
能夠經過設置,使某臺節點不運行service,以下:
[root@node01 ~]# docker node update --availability drain node01 //設置noder01之後不運行容器,但已經運行的容器並不會中止 // --availability:選項後面共有三個選項可配置,以下: active:工做;pause:暫時不工做;drain:永久性的不工做
web頁面以下:
[root@node01 ~]# docker node update --availability drain node02 //node02也不參加工做,但已經運行的容器並不會中止
如圖:
由此能夠得出:不是隻有manager纔有不工做的權力!
[root@node02 ~]# docker swarm leave //那個節點想推出swarm羣集,就在那臺節點上執行這條命令 //節點自動退出swarm羣集(至關於辭職) [root@node01 ~]# docker node rm 節點名稱 //由manager主動刪除節點(至關於開除) [root@node01 ~]# docker node promote 節點名稱 //將節點升級 [root@node01 ~]# docker node demote 節點名稱 //將節點降級 [root@node01 ~]# docker node ls //查看swarm羣集的信息(只能夠在manager角色的主機上查看) [root@node01 ~]# docker node update --availability drain 節點名稱 //調整節點不參加工做 [root@node01 ~]# docker swarm join-token worker //查看加入swarm羣集的令牌(能夠是worker也能夠是manager) [root@node01 ~]# docker service scale web=4 //擴容、收縮swarn羣集servie的數量(取決與羣集本來的數量) //比本來羣集數量多,就是擴容,反之、收縮 [root@node01 ~]# docker service ls //查看建立的service [root@node01 ~]# docker service ps service的名稱 //查看建立的service運行在那些容器上 [root@node01 ~]# docker service create --replicas 6 --name web -p 80:80 nginx //指定運行的service副本數量
- 參與羣集的主機名必定不能衝突,而且能夠互相解析對方的主機名;
- 集羣內的全部節點能夠都是manager角色,可是不能夠都是worker角色;
當指定運行的鏡像時,若是羣集中的節點本地沒有該鏡像,那麼它將會自動下載對應的鏡像;- 當羣集正常工做時,若一個運行着容器的docker服務器發生宕機,那麼,其所運行的全部容器,都將轉移到其餘正常運行的節點之上,並且,就算髮生宕機的服務器恢復正常運行,也不會再接管以前運行的容器;
————————————本文到此結束,感謝閱讀——————————