Docker入门六部曲——Swarm
原文鏈接:http://www.dubby.cn/detail.html?id=8738
準(zhǔn)備工作
- 安裝Docker(版本最低1.13)。
- 安裝好Docker Compose,上一篇文章介紹過的。
- 安裝好Docker Machine,上一篇文章也提到了,Mac和Windows已經(jīng)預(yù)先安裝了,但是Linux需要你自己安裝。如果是Windows10,那么請(qǐng)使用Docker Toolbox。
- 閱讀完Docker入門六部曲——基本引導(dǎo)。
- 閱讀完Docker入門六部曲——容器。
- 閱讀完Docker入門六部曲——服務(wù)。
- 確保你已經(jīng)按照前幾篇所介紹的,把你的鏡像push到遠(yuǎn)端倉庫了。
- 確保你的鏡像可以正常的部署。
- 按照Docker入門六部曲——服務(wù)介紹的,寫出了你的
docker-compose.yml文件。
介紹
Docker入門六部曲——服務(wù)我們已經(jīng)足額會(huì)了定義服務(wù),并且伸縮服務(wù)的容量。
這一篇,你可以看到如何把應(yīng)用部署到集群中去,運(yùn)行在多個(gè)機(jī)器上。Swarm可以幫助我們?cè)诙嗳萜?#xff0c;多機(jī)器上部署服務(wù)。
理解Swarm集群
Swarm就是一個(gè)運(yùn)行著Docker的集群。并且,你還可以使用Docker名來控制這個(gè)集群,但是你只能對(duì)swarm manager下達(dá)命令。集群中的機(jī)器可以是真實(shí)的物理機(jī),也可以是虛擬機(jī)。加入swarm之后,他們都是一個(gè)節(jié)點(diǎn)。
Swarm manager可以使用不同的策略來運(yùn)行容器,例如“最空節(jié)點(diǎn)”策略——選擇使用率最低的節(jié)點(diǎn)來運(yùn)行容器;或者“全局”策略——每一個(gè)節(jié)點(diǎn)至少有一個(gè)鏡像的容器。你可以在Compose文件里指定策略。
Swarm manager就是在這個(gè)集群中,你可以執(zhí)行命令,或者授權(quán)其他工作節(jié)點(diǎn)加入的那個(gè)管理節(jié)點(diǎn)。工作節(jié)點(diǎn)就是那些只提供資源,但不能授權(quán)其他節(jié)點(diǎn)加入集群的節(jié)點(diǎn)。
配置你的swarm
一個(gè)swarm集群由很多個(gè)機(jī)器組成,不管是虛擬機(jī)還是物理機(jī)都可以。最簡單的方式就是執(zhí)行docker swarm init來開啟一個(gè)swarm節(jié)點(diǎn),并且把當(dāng)前執(zhí)行命令的節(jié)點(diǎn)作為管理節(jié)點(diǎn),然后在其他機(jī)器上執(zhí)行docker swarm join來加入這個(gè)swarm集群。
本地虛擬機(jī)(Mac,Linux,Windows7,Windows8)
為了簡單,我們用虛擬機(jī)來完成swarm集群配置吧。你需要安裝VirtualBox。
然后使用docker-machine來創(chuàng)建幾個(gè)虛擬機(jī):
$ docker-machine create --driver virtualbox myvm1
$ docker-machine create --driver virtualbox myvm2
?
這個(gè)需要下載鏡像,如果網(wǎng)絡(luò)不好,請(qǐng)耐心等待。
現(xiàn)在,你本地已經(jīng)有了兩個(gè)虛擬機(jī)了,分別是myvm1和myvm2(可以使用docker-machine ls查看)。我們準(zhǔn)備把myvm1作為管理節(jié)點(diǎn),myvm2作為工作節(jié)點(diǎn)。
我們可以使用docker-machine ssh來登錄虛擬機(jī)或者發(fā)送命令。我們先把myvm1初始化成管理節(jié)點(diǎn)吧:
$ docker-machine ssh myvm1 "docker swarm init"
Swarm initialized: current node <node ID> is now a manager.To add a worker to this swarm, run the following command:docker swarm join \--token <token> \<ip>:<port>
?
執(zhí)行失敗,提示要加
--advertise-addr?
使用docker-machine ls查看虛擬機(jī),然后拷貝myvm1的ip,指定端口2377,例如:
docker-machine ssh myvm1 "docker swarm init --advertise-addr 192.168.99.100:2377"
初始化成功后,會(huì)返回一個(gè)提示信息,告訴你怎么加入這個(gè)集群。把這個(gè)命令拷貝下來,然后去myvm2執(zhí)行:
$ docker-machine ssh myvm2 "docker swarm join \
--token <token> \
<ip>:<port>"This node joined a swarm as a worker.
?
注意:反斜線不能丟。
使用docker-machine ssh myvm1可以登錄到myvm1上,使用docker node ls可以查看當(dāng)前swarm集群中的所有節(jié)點(diǎn):
docker@myvm1:~$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
brtu9urxwfd5j0zrmkubhpkbd myvm2 Ready Active
rihwohkh3ph38fhillhhb84sk * myvm1 Ready Active Leader
?
執(zhí)行exit退出登錄,返回原來的機(jī)器。當(dāng)然也可以直接發(fā)送命令:
docker-machine ssh myvm1 "docker node ls"
?
部署應(yīng)用
你一定沒有想到,最難的部分已經(jīng)被你度過去了。現(xiàn)在我們只需要重復(fù)上一篇文章的的步驟就可以了。不過要記住,我們只可以在myvm1上執(zhí)行dokcer命令,因?yàn)樗攀枪芾砉?jié)點(diǎn)。
把之前的docker-compose.yml拷貝過來。使用docker-machine scp上傳到myvm1上:
docker-machine scp docker-compose.yml myvm1:~
?
我們要開始使用swarm來部署啦!同樣還是docker stack deploy:
docker-machine ssh myvm1 "docker stack deploy -c docker-compose.yml getstartedlab"
?
結(jié)束了!
我們來查看一下容器吧:
$ docker-machine ssh myvm1 "docker stack ps getstartedlab"ID NAME IMAGE NODE DESIRED STATE
jq2g3qp8nzwx test_web.1 username/repo:tag myvm1 Running
88wgshobzoxl test_web.2 username/repo:tag myvm2 Running
vbb1qbkb0o2z test_web.3 username/repo:tag myvm2 Running
ghii74p9budx test_web.4 username/repo:tag myvm1 Running
0prmarhavs87 test_web.5 username/repo:tag myvm2 Running
?
注意:DESIRED 和STATE,第一次執(zhí)行命令部署時(shí),需要從遠(yuǎn)端倉庫下載鏡像,所以如果網(wǎng)絡(luò)不好的話,會(huì)過一段時(shí)間才會(huì)是Running。
訪問集群
你可以使用myvm1和myvm2任意一個(gè)ip來訪問這個(gè)集群。這個(gè)集群內(nèi)部的網(wǎng)絡(luò)是共享的,而且是負(fù)載均衡的。可以使用docker-machine ls查看ip。然后在瀏覽器中打開,不斷的刷新,你會(huì)看到5個(gè)容器的id,因?yàn)槭秦?fù)載均衡的。
網(wǎng)絡(luò)示意圖:
伸縮應(yīng)用
和上一篇文章的一樣,你只需要修改docker-compose.yml,然后重新執(zhí)行docker stack deploy就可以了,swarm會(huì)自動(dòng)幫你調(diào)整。
你也可以再創(chuàng)建幾個(gè)虛擬機(jī),然后加入集群。再使用docker stack deploy重新部署,swarm就會(huì)把新的節(jié)點(diǎn)利用起來了。
清掃戰(zhàn)場(chǎng)
如果你想把應(yīng)用給下掉:
docker-machine ssh myvm1 "docker stack rm getstartedlab"
?
如果想讓工作節(jié)點(diǎn)脫離swarm集群:
docker-machine ssh myvm2 "docker swarm leave"如果關(guān)閉管理節(jié)點(diǎn):
docker-machine ssh myvm1 "docker swarm leave --force"
總結(jié)
以上是生活随笔為你收集整理的Docker入门六部曲——Swarm的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Docker入门六部曲——容器
- 下一篇: 如何在团队中做好Code Review