使用Docker Swarm模式搭建Swarm集群

目錄

  1. 概述
  2. 創(chuàng)建和管理Swarm集群
  3. Swarm集群的服務部署實踐

1. 概述

Docker Swarm是原生的Docker集群工具。在Docker版本1.12之后,Docker引擎加入了Swarm模式,將Swarm集成進來。大多數(shù)用戶應該使用集成進Docker引擎的Swarm模式。單獨的Docker Swarm仍然可用,只是它沒有集成進Docker引擎的API和CLI命令當中。

隨著Docker的不斷開發(fā),在版本1.12之后,Docker引擎加入了Swarm模式,用戶可以通過原生的Docker CLI命令操作Swarm集群。

本篇使用的環(huán)境包括3個節(jié)點,一個作為Swarm的manager節(jié)點,兩個為worker節(jié)點,機器名和IP地址如下:

  • centos7-Master: 192.168.71.131 (Swarm manager)
  • centos7-WorkerA: 192.168.71.167 (Swarm worker)
  • centos7-WorkerB: 192.168.71.168 (Swarm worker)

在三臺主機上,都安裝了Docker引擎1.12版,并且主機相互之間可以ping通,主機上的2377、7946、4789端口都打開。

Swarm集群端口, Docker Swarm集群開放了三個端口:

  • 2377端口, 用于集群管理通信
  • 7946端口, 用于集群節(jié)點之間的通信
  • 4789端口, 用于overlay網(wǎng)絡流量

2. 創(chuàng)建Swarm集群

2.1 創(chuàng)建swarm管理節(jié)點

下面開始創(chuàng)建swarm。登錄到centos7主機上,執(zhí)行如下命令:

[root@centos7-Master ~]# docker swarm init --advertise-addr 192.168.71.131
Swarm initialized: current node (41atspd62he1vshs4jmhpyufj) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join \
    --token SWMTKN-1-49ueborzkg0v6l3xu2g1d5zfgsjn1xobqvctwozq14m07n1ak0-2llwi551ii09zeyus5r3zi3un \
    192.168.71.131:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

--advertise-addr參數(shù)表示其它swarm中的worker節(jié)點使用此ip地址與manager聯(lián)系。命令的輸出包含了其它節(jié)點如何加入集群的命令。

如果你不知道或者忘記了Swarm Manager節(jié)點的Token信息, 你可以在Manager節(jié)點上執(zhí)行以下命令查看Worker節(jié)點連接所需要的Token信息。

[root@centos7-Master ~]# docker swarm join-token worker
To add a worker to this swarm, run the following command:

    docker swarm join \
    --token SWMTKN-1-35z0vriry09vkm17vn1tvj0wzmbv1xfy77c0po7c5op2lyhkgk-635ho8efqfhrm817gpyjkho9x \
    192.168.202.15:2377

使用docker infodocker node ls查看集群中的相關(guān)信息:

[root@centos7-Master ~]# docker info
...
Swarm: active
NodeID: 41atspd62he1vshs4jmhpyufj
Is Manager: true
ClusterID: 5nl0kyz1dfmkgg2sx04vr8zoi
Managers: 1
Nodes: 1
Orchestration:
Task History Retention Limit: 5
...

[root@centos7-Master ~]# docker node ls
ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
41atspd62he1vshs4jmhpyufj *  centos7   Ready   Active        Leader

node ID旁邊那個*號表示現(xiàn)在連接到這個節(jié)點上。

2.2 將Worker節(jié)點加入swarm集群

登錄到centos7-WorkerA主機上,執(zhí)行前面創(chuàng)建swarm時輸出的命令:

[root@centos7-workerA ~]# docker swarm join \
>     --token SWMTKN-1-49ueborzkg0v6l3xu2g1d5zfgsjn1xobqvctwozq14m07n1ak0-2llwi551ii09zeyus5r3zi3un \
>     192.168.71.131:2377
This node joined a swarm as a worker.

如果當時創(chuàng)建swarm時沒有記下命令的輸出,可以通過在manager節(jié)點上運行docker swarm join-token worker命令來獲取如何加入swarm的命令。

在另一臺主機centos7-WorkerB上也執(zhí)行相同的命令,最后在manager節(jié)點上看一下集群節(jié)點的狀態(tài):

[root@centos7-Master ~]# docker node ls
ID                           HOSTNAME         STATUS  AVAILABILITY  MANAGER STATUS
0b57ews522yiz8xyhy3jz34ci    centos7-WorkerB  Ready   Active        
41atspd62he1vshs4jmhpyufj *  centos7-Master   Ready   Active        Leader
d1lurs40mlah70spbetcsl9rw    centos7-WorkerA  Ready   Active 

錯誤處理:

  • 問題描述:

如果在添加Swarm集群節(jié)點時,出現(xiàn)錯誤“Error response from daemon: Timeout was reached before node was joined. The attempt to join the swarm will continue in the background. Use the docker info command to see the current swarm status of your node."

  • 原因分析:

由于Swarm集群中Manager節(jié)點中需要設置防火墻的訪問權(quán)限,將集群管理端口加入防火墻的訪問控制策略。

  • 解決辦法:

在Manager節(jié)點主機的防火墻中加入端口的訪問控制策略。

2.3 管理Swarm集群

2.3.1 刪除Swarm集群節(jié)點

如果想在Docker Swarm集群中刪除Docker的節(jié)點, 需要在須刪除的Docker節(jié)點下執(zhí)行命令:

[root@centos7-WorkerA ~]# docker swarm leave
Node left the swarm.

在Docker Swarm集群中,在刪除Docker集群節(jié)點后,集群中該節(jié)點仍然存在,但是狀態(tài)顯示為Down, 需要在Swarm的Manager節(jié)點執(zhí)行以下命令, 刪除已經(jīng)移除的Worker節(jié)點:

[root@centos7-Master ~]# docker node rm --force 4ukr7ghj4iuvb89gu0g5ok1d
4ukr7ghj4iuvb89gu0g5ok1d

2.3.2 更新Swarm集群節(jié)點

如果需要對Docker Swarm節(jié)點進行更新,需要在manager節(jié)點上執(zhí)行命令:

[root@centos7-Master ~]# docker swarm update 
Swarm updated.

3. Swarm集群的服務部署實踐

3.1 在Swarm中部署服務

在centos7-Master也就是manager節(jié)點上運行如下命令來部署服務:

[root@centos7-Master ~]# docker service create --replicas 1 --name helloworld alpine ping docker.com
50r6d8w4cwzi45s8865p9pdn4

參數(shù)說明:

  • --replicas參數(shù)指定啟動的服務由幾個實例組成;
  • --name參數(shù)指定啟動服務的服務名;
  • alpine ping docker.com指定了使用alpine鏡像創(chuàng)建服務,實例啟動時運行ping docker.com命令。

這與docker run命令是一樣的。

使用docker service ls查看正在運行服務的列表:

[root@centos7-Master ~]# docker service ls
ID            NAME        REPLICAS  IMAGE   COMMAND
50r6d8w4cwzi  helloworld  1/1       alpine  ping docker.com

3.2 查詢Swarm中服務的信息

在部署了服務之后,登錄到manager節(jié)點,運行下面的命令來顯示服務的信息。參數(shù)--pretty使命令輸出格式化為可讀的格式,不加--pretty可以輸出更詳細的信息:

[root@centos7-Master ~]# docker service inspect --pretty helloworld
ID:        50r6d8w4cwzi45s8865p9pdn4
Name:        helloworld
Mode:        Replicated
Replicas:    1
Placement:
UpdateConfig:
Parallelism:    1
On failure:    pause
ContainerSpec:
Image:        alpine
Args:        ping docker.com
Resources:

使用命令docker service ps <SERVICE-ID>可以查詢到哪個節(jié)點正在運行該服務:

[root@centos7-Master ~]$ docker service ps helloworld
ID                         NAME          IMAGE   NODE            DESIRED        STATE  CURRENT STATE           ERROR
541qk5jdrb71ypna9y5zw2l33  helloworld.1  alpine  centos7-Master  Running        Running 12 minutes ago  

3.3 在Swarm中動態(tài)擴展服務

登錄到manager節(jié)點,使用命令docker service scale <SERVICE-ID>=<NUMBER-OF-TASKS>來將服務擴展到指定的實例數(shù):

[root@centos7 ~]# docker service scale helloworld=5
helloworld scaled to 5

再次查詢服務的狀態(tài)列表:

[root@centos7-Master ~]$ docker service ps helloworld
ID                         NAME          IMAGE   NODE             DESIRED  STATE  CURRENT STATE           ERROR
541qk5jdrb71ypna9y5zw2l33  helloworld.1  alpine  centos7-Master    Running        Running 16 minutes ago  
96s46qpl3qd94ntw3n2bt81m8  helloworld.2  alpine  centos7-WorkerB   Running        Running 17 seconds ago  
6p1u8hj4y31i4pjmwh8zvvf2h  helloworld.3  alpine  centos7-WorkerA   Running        Running 8 seconds ago   
02jn1fxkx8juwizk6fjgv9r9n  helloworld.4  alpine  centos7-WorkerA   Running        Running 9 seconds ago   
btbrvtnjjmgyb8emwmznziho9  helloworld.5  alpine  centos7-Master    Running        Running 27 seconds ago  

可見Swarm集群創(chuàng)建了4個新的task來將整個服務的實例數(shù)擴展到5個。這些服務分布在不同的Swarm節(jié)點上。

3.4 刪除Swarm集群中的服務

在manager節(jié)點上運行docker service rm helloworld便可以將服務刪除。刪除服務時,會將服務在各個節(jié)點上創(chuàng)建的容器一同刪除,而并不是將容器停止。

此外Swarm模式還提供了服務的滾動升級,將某個worker置為維護模式,及路由網(wǎng)等功能。在Docker將Swarm集成進Docker引擎后,可以使用原生的Docker CLI對容器集群進行各種操作,使集群的部署更加方便、快捷。

3.5 更新Swarm集群中的服務版本

在前面的步驟中, 我們擴展了一個服務的多個實例, 如上所示, 我們擴展了基于Tomcat Server 8.5.8的Docker鏡像。 假如,現(xiàn)在我們需要使用Tomcat Server 8.6.0版本做為Docker容器版本來替換原有的Tomcat Server 8.5.8版本。

  1. 在Swarm集群中的Manager節(jié)點上執(zhí)行操作,用于完成服務版本的更新。
[root@centos7-Master ~]# docker service update --image tomcat:8.6.0 tomcat-service
tomcat-service

服務版本更新計劃將按以下步驟執(zhí)行:

  • 停止第一個任務
  • 計劃對已停止任務的更新
  • 啟動已更新任務的容器
  • 如果任務更新返回“RUNNING”狀態(tài),等待指定的延遲時間后,停止下一個任務
  • 如果在任務更新時,任務返回“FAILED”狀態(tài),將會暫停更新。

重新啟動一個暫停更新的服務, 可以使用docker service update <SERVICE-ID>命令, 例如:

[root@centos7-Master ~]# docker service update tomcat-service
  1. 查看服務版本更新結(jié)果
[root@centos7-Master ~]# docker service ps tomcat-service

3.6 停用Swarm集群中的服務節(jié)點

如果我們想要停止Swarm集群中某個服務的Worker節(jié)點, 我們可以使用docker node update --availability drain <Node-ID>來停止Worker節(jié)點上的服務。

[root@centos7-Master ~]# docker node update --availability drain centos7-WorkerA
centos7-WorkerA

在停止Worker節(jié)點上的服務后, 我們可以通過docker node inspect --pretty <Node-ID>查看節(jié)點狀態(tài)。

[root@centos7-Master ~]# docker node inspect --pretty centos7-WorkerA
ID:                     ayxx0k8p3hq04zjuemq6p43rq
Hostname:               centos7-WorkerA
Joined at:              2016-12-26 07:07:13.422672934 +0000 utc
Status:
 State:                 Ready
 Availability:          Drain
Platform:
 Operating System:      linux
 Architecture:          x86_64
Resources:
 CPUs:                  4
 Memory:                3.703 GiB
Plugins:
  Network:              bridge, host, null, overlay
  Volume:               local
Engine Version:         1.12.5

使用docker service ps tomcat-service查看當前Tomcat啟動的集群信息。

[root@centos7-Master ~]# docker service ps tomcat-service
ID                         NAME                  IMAGE                                         NODE           DESIRED STATE  CURRENT STATE              ERROR
2vmq4yc9rnsx4etb10z0oah66  tomcat-service.1      192.168.202.14:5000/centos-tomcat858:centos7  centos7-Master  Running        Running about an hour ago  
6hjjuw1jp4037yt48cievtxt5  tomcat-service.2      192.168.202.14:5000/centos-tomcat858:centos7  centos7-Master  Running        Running 3 minutes ago      
cpzh34flx1i7e9sksfr1dr3xu   \_ tomcat-service.2  192.168.202.14:5000/centos-tomcat858:centos7  centos7-WorkerA  Shutdown       Shutdown 3 minutes ago     
eaimtl1swkxrnqhs2h8clodrb  tomcat-service.3      192.168.202.14:5000/centos-tomcat858:centos7  centos7-Master  Running        Running 3 minutes ago      
54pdp8oj1ww2mtrw3ac3m0lwb   \_ tomcat-service.3  192.168.202.14:5000/centos-tomcat858:centos7  centos7-WorkerA  Shutdown       Shutdown 3 minutes ago   

如果我們需要重新啟用WorkerA的Swarm集群服務, 我們可以通過docker node update --availability active <NODE-ID>來實現(xiàn)對服務節(jié)點的啟用。

[root@centos7-Master ~]# docker node update --availability active centos7-WorkerA
centos7-WorkerA

[root@centos7-Master ~]# docker node inspect --pretty centos7-WorkerA
ID:                     ayxx0k8p3hq04zjuemq6p43rq
Hostname:               centos7-WorkerA
Joined at:              2016-12-26 07:07:13.422672934 +0000 utc
Status:
 State:                 Ready
 Availability:          Active
Platform:
 Operating System:      linux
 Architecture:          x86_64
Resources:
 CPUs:                  4
 Memory:                3.703 GiB
Plugins:
  Network:              bridge, host, null, overlay
  Volume:               local
Engine Version:         1.12.5

當我們設置Swarm集群的Worker節(jié)點為可用時,它便能接收新的任務:

  • 當服務需要進行擴展時
  • 當對服務的版本進行更新時
  • 當我們對停用另外一個Swarm集群節(jié)點時
  • 當任務在另外一個活動狀態(tài)節(jié)點出現(xiàn)失敗時
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • 目標:在docker v1.12版本搭建swarm集群,熟悉其用法,驗證其功能。 環(huán)境: swarm-manage...
    威谷子閱讀 1,079評論 3 8
  • 摘要:本文講的是使用Docker Swarm來運行服務【編者的話】本文介紹了Docker 1.12中的Docker...
    暖夏未眠丶閱讀 1,147評論 0 0
  • 距離上次最嚴重的“莫蘭蒂”臺風不到半個月,又一波臺風來襲!據(jù)氣象部門預報,今年第17號臺風“鲇魚”預計于28日前后...
    月明月星閱讀 2,018評論 3 1
  • 畫不動了,作為一個上班狗~~真心是累啊 未完待續(xù)~~ 今天第一天上班,工作真心很棒。很喜歡
    山栗也閱讀 384評論 0 0
  • 孩提時 踩著土路生長 身心發(fā)育挺爽 一輩輩 一群群 一代代 代代相傳 土里生 土里長 體壯心善情真 而如今 踏著水...
    旖旎i閱讀 206評論 6 7

友情鏈接更多精彩內(nèi)容