部署Docker swarm集羣(一)

博文大綱
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

1、Docker swarm簡介

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

2、環境準備

部署Docker swarm集羣(一)

注意事項:瀏覽器

  • 保證時間同步;
  • 關閉防火牆與SElinux(實驗環境);
  • 更改主機名;
  • 編寫host文件,保證能夠i進行域名解析;

3、初始化Swarm羣集

[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通訊的地址

命令的返回信息,如圖:
部署Docker swarm集羣(一)
圖中①的命令:以worker身份加入swarm羣集中;
②的命令:以manager身份加入swarm羣集中;
出現上圖表示初始化成功!注意:--token表示期限爲24小時;服務器

4、配置node0二、node03加入、離開swarm羣集

###################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身份加入羣集的命令

如圖:
部署Docker swarm集羣(一)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
//自行驗證

5、部署圖形化UI

部署圖形化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指定的是容器

使用瀏覽器訪問:
部署Docker swarm集羣(一)
瀏覽器能夠正常訪問,則表示圖形化UI界面部署完成!

6、docker swarm羣集的service服務配置

node01發佈一個任務,(必須在manager角色的主機上)運行六個容器,命令以下:

[root@node01 ~]# docker service create --replicas 6  --name web -p 80:80 nginx
// --replicas:副本數量;大概能夠理解爲一個副本就是一個容器

容器運行完成後,能夠登陸web頁面進行查看,如圖:
部署Docker swarm集羣(一)

注意:若是另外兩臺節點服務器上沒有相應的驚醒,則默認會從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頁面以下:
部署Docker swarm集羣(一)

恢復node02,web頁面以下:
部署Docker swarm集羣(一)

即便node02恢復正常,也不會將service分配給node02。

所以,能夠得出一個結論:若是node發生故障,service會自動跑到可用的節點上;反之,若是node沒有發生故障,默認狀況下,service不會輕易更改節點!

7、實現service的擴容、收縮

擴容:就i是添加幾臺service;
收縮:就是減小几臺service;

針對上述環境實現收縮、擴容;

(1)service擴容

[root@node01 ~]# docker service scale web=8
//本來有6個service,如今增長到8臺

web頁面以下:
部署Docker swarm集羣(一)
關於service分配到那臺node節點上,是根據docker swarm自身的算法進行分配的。

(2)service收縮

[root@node01 ~]# docker service scale web=4
//本來有8個service,如今減小到4臺

web頁面以下:
部署Docker swarm集羣(一)

(3)設置某個node不運行service

上述環境中,三臺都是manager,即便是一臺manager、兩臺worker默認狀況manager也是進行工做的,將node0二、node03降級爲worker,執行以下命令:

[root@node01 ~]# docker node demote node02
[root@node01 ~]# docker node demote node03

如圖:
部署Docker swarm集羣(一)

能夠經過設置,使某臺節點不運行service,以下:

[root@node01 ~]# docker node update --availability drain node01
//設置noder01之後不運行容器,但已經運行的容器並不會中止
// --availability:選項後面共有三個選項可配置,以下:
active:工做;pause:暫時不工做;drain:永久性的不工做

web頁面以下:
部署Docker swarm集羣(一)

[root@node01 ~]# docker node update --availability drain node02
//node02也不參加工做,但已經運行的容器並不會中止

如圖:
部署Docker swarm集羣(一)

由此能夠得出:不是隻有manager纔有不工做的權力!

8、docker Swarm羣集經常使用命令

[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副本數量

9、docker swarm總結

  • 參與羣集的主機名必定不能衝突,而且能夠互相解析對方的主機名;
  • 集羣內的全部節點能夠都是manager角色,可是不能夠都是worker角色;
    當指定運行的鏡像時,若是羣集中的節點本地沒有該鏡像,那麼它將會自動下載對應的鏡像;
  • 當羣集正常工做時,若一個運行着容器的docker服務器發生宕機,那麼,其所運行的全部容器,都將轉移到其餘正常運行的節點之上,並且,就算髮生宕機的服務器恢復正常運行,也不會再接管以前運行的容器;

————————————本文到此結束,感謝閱讀——————————

相關文章
相關標籤/搜索