1. 程式人生 > >Docker Swarm安裝(以ubuntu為例)

Docker Swarm安裝(以ubuntu為例)

Swarm介紹

Swarm是Docker公司在2014年12月初發布的一套較為簡單的工具,用來管理Docker叢集,它將一群Docker宿主機變成一個單一的,虛擬的主機。Swarm使用標準的Docker API介面作為其前端訪問入口,換言之,各種形式的Docker Client(docker client in Go, docker_py, docker等)均可以直接與Swarm通訊。Swarm幾乎全部用Go語言來完成開發,上週五,4月17號,Swarm0.2釋出,相比0.1版本,0.2版本增加了一個新的策略來排程叢集中的容器,使得在可用的節點上傳播它們,以及支援更多的Docker命令以及叢集驅動。

Swarm deamon只是一個排程器(Scheduler)加路由器(router),Swarm自己不執行容器,它只是接受docker客戶端傳送過來的請求,排程適合的節點來執行容器,這意味著,即使Swarm由於某些原因掛掉了,叢集中的節點也會照常執行,當Swarm重新恢復執行之後,它會收集重建叢集資訊。下面是Swarm的結構圖:

這裡寫圖片描述

這裡寫圖片描述

如何使用Swarm

有3臺機器:
sclu083:10.13.181.83
sclu084:10.13.181.84
atsg124:10.32.105.124
利用這三臺機器建立一個Docker叢集,其中sclu083同時充當swarm manager管理叢集。

Swarm安裝

最簡單的安裝Swarm的方式就是用Docker官方提供的Swarm映象:

$ sudo docker pull swarm

Docker叢集管理需要服務發現(Discovery service backend)功能。Swarm支援以下幾種discovery service backend:Docker Hub上面內建的服務發現功能,本地的靜態檔案描述叢集(static file describing the cluster),etcd(順帶說一句,etcd這玩意貌似很火很有前途,有時間研究下),consul,zookeeper和一些靜態的ip列表(a static list of ips)。本文會詳細介紹前面兩種方法backend的使用。

在使用Swarm進行叢集管理之前,需要先把準備加入叢集的所有的節點的docker deamon的監聽埠修改為0.0.0.0:2375,可以直接使用 sudo docker –H tcp://0.0.0.0:2375 &命令,也可以在配置檔案中修改

$ sudo vim /etc/default/docker

在檔案的最後面新增下面這句

D0OCKER_OPTS="-H 0.0.0.0:2375 –H unix:///var/run/docker.sock"

這裡寫圖片描述

注意:一定是要在所有的節點上進行修改,修改之後要重啟docker deamon

$ sudo service docker restart
第一種方法:使用Docker Hub上面內建的服務發現功能

第一步
在任何一個節點上面執行swarm create命令來建立一個叢集標誌。這條命令執行完畢之後,swarm會前往Docker Hub上內建的發現服務中獲取一個全球唯一的token,用以唯一的標識swarm管理的Docker叢集。

$ sudo docker run --rm swarm create

我們在sclu084 這臺機器上執行上面的命令

這裡寫圖片描述

返回的token是d947b55aa8fb9198b5d13ad81f61ac4d,這個token一定要記住,因為接下來的操作都會用到這一個token。

第二步
在所有的要加入叢集的機器上面執行swarm join命令,把機器加入叢集。

本次試驗就是要在所有的三臺機器上執行命令。

$ sudo docker run -d swarm join –addr=ip_address:2375 token://d947b55aa8fb9198b5d13ad81f61ac4d

注意:

必需要以daemon的形式執行,否則termnal退出後節點不在受管理
ip_address:指的是被管理節點的IP或Name,如本例子中可以是84或124
token:指的是管理節點的token值,如本例中為83的token值

第三步
啟動swarm manager。

因為我們要讓sclu083充當Swarm管理節點,所以我們要在這臺機器上面執行swarm manage命令

$ sudo docker run –d –p 2376:2375 swarm manage token:// d947b55aa8fb9198b5d13ad81f61ac4d

重點內容需要注意的是:在這條命令中,第一:要以daemon的形式執行swarm;第二:埠對映:2376可以更換成任何一個本機沒有佔用的埠,一定不能是2375,否則就會出問題。

執行結果如下如所示:

這裡寫圖片描述

執行完這個命令之後,整個叢集已經啟動起來了。

現在可以在任何一個節點上檢視叢集上的所有節點了。

這裡寫圖片描述

之後可以在任何一臺安裝了docker的機器上面通過命令(命令中要指明swarm maneger 機器的IP地址和埠)在這個叢集上面執行Dcoker容器操作。

現在在10.13.181.85這臺機器上面檢視叢集的節點的資訊。info命令可以換成任何一個Swarm支援的docker命令,這些命令可以檢視官方文件

$ sudo docker –H 10.13.181.83:2376 info

這裡寫圖片描述

由上圖的結果,我們可以發現一個問題:明明這個小叢集中是有3個節點的,但是info命令只顯示了2個節點。還缺少節點10.32.105.124。為什麼會出現這個情況呢?

因為10.32.105.124這臺機器沒有設定上面的docker daemon監聽0.0.0.0:2375這個埠,所以Swarm沒辦法吧這個節點加入叢集中來。

在使用Docker Hub內建的發現服務時,會出現一個問題,就是使用swarm create時會出現

time="2015-04-21T08:56:25Z" level=fatal msg="Get https://discovery-stage.hub.docker.com/v1/clusters/d947b55aa8fb9198b5d13ad81f61ac4d: dial tcp: i/o timeout"

類似於這樣的錯誤,不知道是什麼原因,有待解決。(可能是防火牆的問題)

當使用Docker Hub內建的服務發現功能出現問題時,可以使用下面的第二種方法。

第二種方法:使用檔案

第二種方法相對而言比第一種方法要簡單,也更不容易出現timeout的問題。

第一步
在sclu083這臺機器上新建一個檔案,把要加入叢集的機器的IP地址寫進去

這裡寫圖片描述

第二步
在sclu083這臺機器上面執行swarm manage命令:

$ sudo docker run –d –p 2376:2375 –v $(pwd)/cluster:/tmp/cluster swarm manage file:///tmp/cluster

這裡寫圖片描述

注意:這裡一定要使用-v命令,因為cluster檔案是在本機上面,啟動的容器預設是訪問不到的,所以要通過-v命令共享。還有,file:///千萬不能忘記了。

可以看到,swarm已經執行起來了。現在可以檢視下叢集節點資訊了,使用命令:

$ sudo docker run –rm –v $(pwd)/cluster:/tmp/cluster swarm list file:///tmp/cluster

這裡寫圖片描述

(在使用檔案作為服務發現的時候,貌似manage list命令只能在swarm manage節點上使用,在其他節點上好像是用不了)

好了,現在叢集也已經執行起來了,可以跟第一種方法一樣在其他機器上使用叢集了。同樣在sclu085 機器上做測試:

這裡寫圖片描述

可以看到,成功訪問並且節點資訊是正確的。接下來可以把上面的info命令替換成其他docker可執行命令來使用這個曉得Docker叢集了。