在《Docker簡單入門》中編寫一個應(yīng)用程序呆奕,并將其轉(zhuǎn)化為服務(wù)梢杭,在《Docker分布式應(yīng)用》中儒旬,使應(yīng)用程序在生產(chǎn)過程中擴(kuò)展5倍栏账,并定義應(yīng)該如何運(yùn)行。現(xiàn)在將此應(yīng)用程序部署到集群上栈源,并在多臺機(jī)器上運(yùn)行它挡爵,通過將多臺機(jī)器連接到Dockerized
集群上,使多容器甚垦、多機(jī)器應(yīng)用成為可能茶鹃。
Swarm(集群)是運(yùn)行Docker并加入到一個集群中的一組機(jī)器,在這種情況下艰亮,您將繼續(xù)運(yùn)行以往的Docker命令闭翩,但是現(xiàn)在它們將由swarm manager(集群管理器)在集群上執(zhí)行。集群中的機(jī)器可以是物理的或虛擬的迄埃,加入集群后疗韵,它們被稱為nodes(節(jié)點(diǎn))。集群管理器可以使用多種策略來運(yùn)行容器侄非,比如emptiest node(最空的節(jié)點(diǎn))蕉汪,它使用容器填充最少使用的機(jī)器〕言梗或者global(全局)者疤,它確保了每臺機(jī)器只能得到指定容器的一個實(shí)例。您可以指示集群管理器在組成文件中使用這些策略叠赦,就像您已經(jīng)使用的策略一樣驹马。
集群管理器是集群中唯一可以執(zhí)行命令的機(jī)器,或者授權(quán)其他機(jī)器作為workers(工人)加入集群。工人只是在那里提供能力糯累,并沒有權(quán)力告訴任何其他機(jī)器可以做什么和不可以做什么算利。到目前為止,您已經(jīng)在本地機(jī)器上以單主機(jī)模式使用Docker寇蚊,但是Docker也可以切換到集群模式,這就是使用集群的原因棍好。當(dāng)立即啟用集群模式使當(dāng)前機(jī)器成為集群管理器時仗岸,Docker將運(yùn)行您正在管理的集群上執(zhí)行的命令,而不僅僅是在當(dāng)前的機(jī)器上借笙。
創(chuàng)建一個集群
一個集群由多個節(jié)點(diǎn)組成扒怖,可以是物理機(jī)或虛擬機(jī),做法很簡單业稼,運(yùn)行docker swarm init
來啟用集群模式盗痒,并讓你的當(dāng)前機(jī)器成為集群管理器,然后在其他機(jī)器上運(yùn)行docker swarm join
讓它們作為工人加入集群低散。
接下來使用虛擬機(jī)快速創(chuàng)建一個集群俯邓,需要一個可以創(chuàng)建虛擬機(jī)(VMs)的虛擬機(jī)管理程序,在機(jī)器上安裝Oracle VirtualBox應(yīng)用程序熔号。如果是Windows 10系統(tǒng)稽鞭,而且安裝了Hyper-V,則無需安裝VirtualBox引镊,而應(yīng)該使用Hyper-V朦蕴。
現(xiàn)在,使用docker-machine
創(chuàng)建幾個虛擬機(jī)弟头,使用VirtualBox驅(qū)動程序:
$ docker-machine create --driver virtualbox myvm1
$ docker-machine create --driver virtualbox myvm2
您現(xiàn)在創(chuàng)建了兩個名為myvm1和myvm2的虛擬機(jī)吩抓,使用下面命令列出機(jī)器并獲取其IP地址:
$ docker-machine ls
第一臺機(jī)器將作為管理員,執(zhí)行管理命令赴恨,認(rèn)證工人加入群體疹娶,第二臺機(jī)器將成為工人÷琢可以使用docker-machine ssh
將命令發(fā)送到虛擬機(jī)蚓胸,執(zhí)行docker swarm init
使myvm1成為集群管理器:
$ docker-machine ssh myvm1 "docker swarm init --advertise-addr <myvm1的ip>"
在執(zhí)行docker swarm init
后,響應(yīng)中會包含一個預(yù)配置的docker swarm join
命令除师,您可以在要添加的任何節(jié)點(diǎn)上運(yùn)行該命令沛膳。復(fù)制這個命令,并通過docker-machine ssh
把它發(fā)送到名為myvm2的虛擬機(jī)汛聚,讓myvm2作為工人加入新的集群:
$ docker-machine ssh myvm2 "docker swarm join --token <token> <ip>:2377"
將myvm2加入集群時锹安,端口號要選擇2377,因?yàn)槎丝?376是Docker守護(hù)進(jìn)程端口,不要使用此端口叹哭,否則可能會遇到錯誤忍宋。在管理器上運(yùn)行docker node ls
以查看集群中的節(jié)點(diǎn):
$ docker-machine ssh myvm1 "docker node ls"
現(xiàn)在集群己經(jīng)創(chuàng)建完成,如果想要刪除集群风罩,可以使用docker swarm leave
在每個節(jié)點(diǎn)運(yùn)行糠排。
在集群上部署應(yīng)用程序
現(xiàn)在只要重復(fù)《Docker分布式應(yīng)用》中使用的過程來部署新的集群,只要記住超升,只有像myvm1這樣的集群管理器才能執(zhí)行Docker命令入宦,工人只是干活的。
到目前為止室琢,您已經(jīng)在docker-machine ssh
中包裝了Docker命令來與虛擬機(jī)進(jìn)行通信乾闰,另一個選擇是運(yùn)行docker-machine env <machine>
來獲取并運(yùn)行一個配置當(dāng)前的命令,以便與虛擬機(jī)上的Docker守護(hù)進(jìn)程通信盈滴。這個方法更好涯肩,因?yàn)樗试S使用本地docker-compose.yml
文件來“遠(yuǎn)程”部署應(yīng)用程序,而不需要將它復(fù)制到任何地方巢钓。
執(zhí)行docker-machine env myvm1
命令病苗,復(fù)制輸出的最后一行提供的命令,然后粘貼并運(yùn)行該命令症汹,以將終端配置為與集群管理器myvm1對話:
$ docker-machine env myvm1
$ eval $(docker-machine env myvm1)
運(yùn)行docker-machine ls
以驗(yàn)證myvm1現(xiàn)在是活動的機(jī)器铅乡,即活動狀態(tài)旁邊有星號:
$ docker-machine ls
現(xiàn)在可以使用myvm1的權(quán)限作為集群管理器,通過使用docker stack deploy
命令和docker-compose.yml
的本地副本來部署應(yīng)用程序烈菌。通過docker-machine
命令配置連接到myvm1阵幸,仍然可以訪問本地主機(jī)上的文件,確保在docker-compose.yml
文件同一個目錄下芽世,運(yùn)行以下命令在myvm1上部署應(yīng)用程序:
$ docker stack deploy -c docker-compose.yml getstartedlab
就這樣挚赊,應(yīng)用程序被部署在一個集群上,現(xiàn)在济瓢,您可以使用Docker命令看到服務(wù)和關(guān)聯(lián)的容器已經(jīng)在myvm1和myvm2之間分配了:
$ docker stack ps getstartedlab
訪問集群
現(xiàn)在可以從myvm1或myvm2的IP地址訪問應(yīng)用程序荠割,網(wǎng)絡(luò)在它們之間共享并負(fù)載平衡。運(yùn)行docker-machine ls
來獲取虛擬機(jī)的IP地址旺矾,并在瀏覽器中訪問其中的任何一個蔑鹦,或使用curl
命令訪問。
您將看到五個不同的容器ID箕宙,它們都是隨機(jī)循環(huán)的嚎朽,展示了負(fù)載平衡。兩個IP地址工作的原因是集群中的節(jié)點(diǎn)參與入口路由網(wǎng)絡(luò)柬帕,這可以確保部署在群集中某個端口的服務(wù)始終將該端口保留給自己哟忍,而不管哪個節(jié)點(diǎn)實(shí)際上正在運(yùn)行該容器狡门。以下是三節(jié)點(diǎn)集群上端口8080上發(fā)布一個名為my-web的服務(wù)的路由網(wǎng)絡(luò)示意圖:
可以通過更改docker-compose.yml
文件來縮放應(yīng)用程序,編輯代碼更改應(yīng)用程序的行為锅很,然后重新構(gòu)建其馏,然后推送新的鏡像,只需再次運(yùn)行docker stack deploy
來部署這些更改爆安∨迅矗可以使用docker swarm join
命令將任何物理或虛擬機(jī)器加入到此集群,并將容量添加到集群扔仓,之后只需運(yùn)行docker stack deploy
部署褐奥,應(yīng)用將利用新的資源。
清理并重新啟動
可以使用docker stack rm
清理堆棧当辐,例如:
$ docker stack rm getstartedlab
可以使用以下命令取消當(dāng)前終端中的docker-machine
環(huán)境變量:
$ eval $(docker-machine env -u)
這會將終端與docker-machine
創(chuàng)建的虛擬機(jī)斷開連接抖僵,并允許繼續(xù)在同一個終端中工作鲤看。如果關(guān)閉本地主機(jī)缘揪,Docker機(jī)器將停止運(yùn)行,您可以通過運(yùn)行docker-machine ls
來檢查機(jī)器的狀態(tài):
$ docker-machine ls
要重新啟動已停止的機(jī)器义桂,可以運(yùn)行:
$ docker-machine start <machine-name>
如果你想刪除這個集群找筝,可以使用docker-machine ssh myvm2 "docker swarm leave"
命令,或者使用docker-machine ssh myvm1 "docker swarm leave --force"
強(qiáng)制刪除慷吊。