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叢集了。