一砂代、介紹
docker swarm是創(chuàng)建服務(wù)器集群的工具,只需要幾條命令就可以創(chuàng)建一個(gè)服務(wù)器集群布讹。它內(nèi)置一些服務(wù)器集群需要的工具琳拭,比如說:服務(wù)查找,網(wǎng)絡(luò)描验,負(fù)載均衡等等白嘁。
docker swarm
先初始化一個(gè)集群(docker swarm init
)柿扣,然后讓服務(wù)器加入到這個(gè)集群里面(docker swarm join
)澈灼,這樣就可以在這個(gè)集群服務(wù)器上面與創(chuàng)建服務(wù)(docker service create
)盔夜,一個(gè)服務(wù)可以用一個(gè)或多容器來支持荠锭,容器之間會(huì)通過overlay網(wǎng)絡(luò)類型進(jìn)行通信。每一個(gè)服務(wù)器節(jié)點(diǎn)都知道這個(gè)集群里的其他服務(wù)器耕魄,如果某一個(gè)服務(wù)器節(jié)點(diǎn)出了問題黍析,docker會(huì)將出了問題的服務(wù)器上面運(yùn)行的容器,轉(zhuǎn)移到集群里的其他服務(wù)器上面屎开。我們不需要配置容器之間和服務(wù)器之間的負(fù)載均衡阐枣,因?yàn)樗莇ocker swarm內(nèi)置的功能。
二奄抽、集群
我在本地使用虛擬機(jī)創(chuàng)建了3個(gè)Linux系統(tǒng)的虛擬機(jī)蔼两,模擬三臺(tái)服務(wù)器(node1[192.168.33.10], node2[192.168.33.11], node3[192.168.33.12])。
1. 創(chuàng)建集群 - swarm init##
首先進(jìn)入到node1中逞度,初始化一個(gè)集群:
docker swarm init --advertise-addr 192.168.33.10:2377
說明:192.168.33.10是node1的ip地址额划,--advertise-addr選項(xiàng)是設(shè)置監(jiān)聽的IP和端口號(hào)。執(zhí)行完档泽,看到提示「集群已經(jīng)初始完俊戳,當(dāng)前節(jié)點(diǎn)是管理員」表示初始化成功。后面還有添加woker節(jié)點(diǎn)的指示和命令馆匿。
docker swarm join \\
--token SWMTKN-1-6cqcc65jtfmldojryxg7s4rpljekcdrobz288mycgyu12gfxlf-bg27cxk75qhbgwjngxn500lqg \\
192.168.33.10:2377
初始化完抑胎,查看集群上節(jié)點(diǎn)的列表,可以執(zhí)行:
docker node ls
目前只有node1一個(gè)節(jié)點(diǎn)渐北,狀態(tài)為Ready阿逃,是個(gè)Leader。
2. 添加服務(wù)器到集群里 - swarm join##
接著登錄到node2中赃蛛,執(zhí)行初始化完成后返回的指令恃锉。
這里會(huì)提示「這個(gè)節(jié)點(diǎn)已作為worker加入到集群中」,再登錄到node3呕臂,同樣的也把它加入到集群中破托。
然后回到node1,查看集群的節(jié)點(diǎn)列表:
現(xiàn)在這個(gè)集群里一共有三個(gè)服務(wù)器歧蒋。node1為管理員土砂,node2,node3為worker疏尿。
3. 創(chuàng)建集群網(wǎng)絡(luò) - overlay##
在集群節(jié)點(diǎn)中運(yùn)行的容器需要一種overlay類型的網(wǎng)絡(luò)瘟芝,我們可以先去創(chuàng)建一個(gè)overlay網(wǎng)絡(luò),然后在創(chuàng)建服務(wù)的時(shí)候使用這個(gè)網(wǎng)絡(luò)褥琐。
docker network create --driver overlay skynet
可以看到新創(chuàng)建的網(wǎng)絡(luò)skynet锌俱,類型為overlay。
4. Swarm - 狀態(tài)的圖形界面##
為了更好的理解集群敌呈,我們可以創(chuàng)建一個(gè)visualizer贸宏,可以即時(shí)的查看集群中服務(wù)器的狀態(tài)和服務(wù)器上面運(yùn)行容器的狀態(tài)造寝。
登錄到manager node1上,執(zhí)行:
docker run -itd -p 5000:5000 -e HOST=192.168.33.10 -e PORT=5000 -v /var/run/docker.sock:/var/run/docker.sock manomarks/visualizer
(這之前我已經(jīng)pull過manomarks/visualizer的鏡像)
打開瀏覽器吭练,訪問http://192.168.33.10:5000:
三诫龙、服務(wù)
1. 創(chuàng)建服務(wù) - service create##
創(chuàng)建好集群服務(wù)器以后就可以創(chuàng)建服務(wù)了,創(chuàng)建服務(wù)可以執(zhí)行:
docker service create --name web --network skynet --publish 3000:3000 --replicas 1 ninghao/node
創(chuàng)建一個(gè)名字叫web鲫咽,網(wǎng)絡(luò)使用剛剛創(chuàng)建的skynet签赃,使用--publish
指定發(fā)布的端口號(hào),這里的3000:3000是ninghao/node鏡像里的nodejs應(yīng)用使用的端口號(hào)分尸,--replicas
指定需要的數(shù)量锦聊。
接著查看一下服務(wù)的列表:
docker service ls
剛創(chuàng)建完成的服務(wù)web,REPLICASE的值為0/1箩绍,表示正處于prepare的狀態(tài)孔庭,還沒正式運(yùn)行。
查看服務(wù)的狀態(tài)可以執(zhí)行:
docker service ps web
等待狀態(tài)變?yōu)镽unning的時(shí)候材蛛,在瀏覽器打開http://192.168.33.10:5000 就可以查看到新增的服務(wù):
訪問http://192.168.33.10:3000 :
2. 負(fù)載均衡 - load balancing##
現(xiàn)在我們已經(jīng)在集群里創(chuàng)建一個(gè)web服務(wù)圆到,服務(wù)現(xiàn)在只有一個(gè)容器,使用docker service ps web
可以查看到容器在node1機(jī)器上面卑吭。上面我們通過訪問node1的ip:192.168.33.10:3000查看到頁面芽淡,那么嘗試訪問node2(192.168.33.11)和node3(192.168.33.12)的3000端口看看。
你會(huì)發(fā)現(xiàn)雖然在node2和node3上沒有容器運(yùn)行那個(gè)應(yīng)用陨簇,但還是可以打開頁面吐绵,觀察頁面顯示的Container ID是一樣的,可見頁面是同一個(gè)容器提供的服務(wù)河绽。這就docker里面的routing mesh技術(shù),而且還內(nèi)置了負(fù)載均衡的功能唉窃。如果訪問的服務(wù)器上沒有提供服務(wù)的容器耙饰,那docker會(huì)重定向到有這個(gè)服務(wù)容器的機(jī)器上面。
3. 擴(kuò)展服務(wù) - service scale##
scale up一下web服務(wù)纹份,現(xiàn)在這個(gè)服務(wù)只有一個(gè)容器苟跪,在node1上面執(zhí)行:
docker service scale web=6
web表示服務(wù)名稱,= 右邊表示容器的數(shù)量蔓涧,執(zhí)行完件已,回到瀏覽器查看,會(huì)陸陸續(xù)續(xù)出現(xiàn)其他的5個(gè)容器元暴,分別分布在3臺(tái)機(jī)器上:
重新訪問一下:http://192.168.33.10:3000 篷扩,留意Container ID會(huì)有變化,現(xiàn)在同時(shí)使用多個(gè)容器提供服務(wù):
scale可以增加容器茉盏,也可以減少容器鉴未。執(zhí)行:
docker service scale web=3
現(xiàn)在每臺(tái)服務(wù)器上都只有一個(gè)容器提供服務(wù)枢冤,總共3個(gè)容器。這是我們?cè)O(shè)置的web的狀態(tài)铜秆,docker會(huì)維護(hù)這個(gè)狀態(tài)淹真,現(xiàn)在我們關(guān)閉node3的機(jī)器:
node3關(guān)閉后,它上面的容器也不見了连茧,但過了一會(huì)核蘸,少了的容器,會(huì)出現(xiàn)在集群里其他機(jī)器上面啸驯。這里是跑到了node2上面:
更新服務(wù) - service update
如果我們想要更新提供服務(wù)的容器中的一些信息值纱,比如:端口、數(shù)據(jù)卷坯汤、鏡像等等虐唠,可以使用:
docker service update [OPTIONS]
先scale up 到6個(gè),下面我們更新一下服務(wù)使用的鏡像:
docker service update web --image ninghao/node:hola
開始更新:
完成更新:
你會(huì)發(fā)現(xiàn)docker會(huì)使用我們指定的鏡像去逐個(gè)逐個(gè)更新(舊版本好像會(huì)一次全部停掉惰聂,再逐個(gè)更新)疆偿,新的容器創(chuàng)建好以后,我們?cè)偃g覽一下搓幌。
已更新杆故,hello會(huì)變成hola。這個(gè)更新的動(dòng)作過程我們可以指定溉愁,比如說想一次更新兩個(gè)容器处铛,每次更新的時(shí)候中間停幾秒。這次換回原來的hello
docker service update web --image ninghao/node --update-parallelism 2 --update-delay 6s
--update-parallelism
指定每次更新的容器數(shù)拐揭。
--update-delay
指定容器更新的間隔撤蟆。
執(zhí)行的一開始會(huì)消失掉兩個(gè)容器,隨后更新完成兩個(gè)容器后堂污,會(huì)等待6秒家肯,然后再更新兩個(gè)。具體可以在http://192.168.33.10:5000 觀察完整過程盟猖。