Docker Swarm搭建多服務器下Docker集羣

  對於有多臺服務器來說,若是每一臺都去手動操控,那將會是一件很是浪費時間的事情,畢竟時間這東西,於咱們而言,十分寶貴,或許在開始搭建環境的時候耗費點時間,感受是正常的,我也如此,花費大堆時間在採坑和填坑的路上,可是當你踩完後,還經過手動管理的方式去維護,那即是折磨,所以對於多臺服務器下的容器編排管理,藉助工具將會節省着大把時間,現現在有名的容器編排工具,K8s、Docker Swarm,甚至功能更強大的Rancher,本次我將使用且是我惟一使用過的Docker Swarm工具搭建Docker集羣並部署服務。html

  Docker Swarm官方文檔地址:https://docs.docker.com/engine/swarm/java

 

1、搭建前期工做

  在以前的文章中,對於一臺新的服務器加入到服務器集羣中,經過Docker Machine去管理,配置好Docker Enginee環境,簡單也方便,同時在配置時,將本地的私鑰發送給了新的服務器,也就配置好了關聯關係,若有須要能夠查看該文章:http://www.javashuo.com/article/p-hxkguhrj-w.htmlnode

  

  加入進來後對於整個服務器集羣來說,可預見的Swarm方式是這樣的,也是最爲簡便的方式管理,Manager做爲容器集羣發起者,也是管理者,通常來說,我會盡量少的在上面部署服務,經過一些方式過濾掉服務在上面的部署,畢竟它的職責更多的側重於管理整個容器集羣,可是對於一些開支小的且比較穩定的服務,也是能夠i直接部署在Manager節點中的,這是一種建議。redis

  這是我當前的服務器下的容器集羣,存在一個Leader也就是Manager,也能夠設置多個,可是現有場景下,徹底知足個人需求了。docker

  

  咱們利用Docker Swarm中的Docker CLI去建立集羣、管理集羣、動態擴容服務。而對於Swarm的版本,建議是Docker版本要高於1.13,在1.13之上,將Swarm功能集成到了Docker中,而對於1.13之下,須要單獨設置Swarm模式,在此建議,使用1.13之上的版本。服務器

  

  在Swarm中有幾個名字概念:微信

  Node:節點,分爲Manager Node和Worker Node,在上圖中有一個Manager節點和三個Worker節點,這個概念很好理解。網絡

  Service:服務,對於Swarm而言,部署服務是它對外的職責,對於整個集羣來說,都是經過部署服務的形式,而且經過擴容、縮放來動態的決定服務數量。ssh

  Task:服務的具體承載,在於Manager節點將服務分發到具體的Worker節點上,屬於下達具體任務概念。相較於Service屬於微觀概念。工具

 

   對於Swarm模式下,須要開啓幾個相關的端口,而在系統中,這幾個端口是默認打開的:

  TCP Port 2377:用於集羣間通訊,

  TCP 和UDP Port 7946:用於節點間通訊,

  UDP Port 4789:用於Overlay網絡方式下通訊,這個是在集羣模式下的網絡通訊方式,單機下采用的是Bridge方式。

 

2、開始搭建Swarm

   在須要設置爲Manager的節點上輸入以下命令,開始容器集羣搭建,IP地址寫如今服務對外IP。

$ docker swarm init --advertise-addr <MANAGER-IP>

  能夠得到以下信息,集羣建立完畢,複製該命令,在其餘子節點上執行完畢,子節點即是加入了該容器集羣(可經過docker-machine ssh xxx的方式快速進入到目的節點中執行)。

  

  對全部節點加入完畢,經過docker node ls命令查看節點信息,加入的節點和自己節點將會顯示出來。

 若是有新的服務器加入了,而且已經安裝好了docker  enginee須要加入到節點中且忘記了這一條token的值,能夠經過在manager上執行該命令再次得到這個值

docker swarm join-token worker

  

  至此,整個容器集羣就搭建完畢,Manager節點和Worker節點都接入進來了。

 

 3、部署服務到集羣

   進入到Manager節點,開始部署一個服務到容器集羣中,經過以下命令建立一個服務:

$ docker service create --replicas 1 --name helloworld alpine ping docker.com

  命令解讀:

  一、docker service create:用於建立服務;

  二、--replicas 用於肯定須要多少個節點容器去運行服務;

  三、對於參數alpine ping docker.com 則是指定alpine鏡像,並在容器啓動後執行ping docker.com操做;

  經過docker service ls查看當前建立的全部服務,能夠經過docker service remove 服務名或ID的形式移除服務,這類操做和Docker的操做是差很少的。

   

  經過docker service inspect --pretty 服務名或ID方式查看服務的詳細信息,

  

  在不帶--pretty參數下,能夠查看到Json格式的詳細信息,

  

  經過命令docker service ps 服務名或ID查看服務運行狀態,

  

 

4、對承載服務的批量容器相關操做

  一、擴容/伸縮現有服務承載容器數量  

  經過scale命令執行,並再次查看服務運行信息:

docker service scale 服務名或ID=實例數量

   

   二、滾動更新使用服務使用鏡像版本,本次從新搭建一個redis服務,用四個實例承載服務,並經過滾動升級redis版本。

  

  對於--update-delay 爲更新先後切換時間,對於後面跟隨的時間類型能夠有時分秒如10h10m10s,

  經過--update -parallelism參數能夠指定最大的實例更新數量,如本次中有四個實例,指定爲2後將最大容許兩個實例更新到新版本中,

  更新實例版本規則,當一個實例更新完畢並返回running才繼續更新下一個實例,若是有一個實例更新失敗,整個更新隊列將會停止,能夠經過--update-failure-action參數指定更新失敗後的解決方式,如docker swarm create或是update服務。

  服務建立後實例運行結果結果

  

 

     如今開始更新版本:

docker service update --image redis:3.0.7 redis

  

   指定新版本鏡像及現有服務名稱,開始更新,查看當前服務運行狀況,四個redis均完成更新。

  

   接下來,經過控制worker節點的狀態來控制是否承載某一個服務,經過以下命令,將現有節點下的host1再也不承載redis服務,命令以下

docker node update --availability drain host1

   經過參數--availability指定爲drain(置空)來設置host1節點不參與服務承載,以下能夠看到原有服務已經移交到manager節點下了。

  

  而後啓用該host1節點恢復爲活躍模式,可是該節點不會再去承載redis服務,由於服務如今並不須要它去承載。

docker node update --availability active host1

   

  至此,對於容器集羣的搭建就此完成了。

  對於容器集羣的其餘高級用法能夠參見官方文檔:https://docs.docker.com/engine/swarm/services/#roll-back-to-the-previous-version-of-a-service

  

  本文地址:http://www.javashuo.com/article/p-zsvfctcs-eu.html

  歡迎關注微信訂閱號,有新的文章將同步到訂閱號中

  

2018-10-27,望技術有成後能回來看見本身的腳步
相關文章
相關標籤/搜索