這是Docker文檔的第四部分的翻譯,原文請點擊這里
必要條件
- 安裝Docker1.13版本或者更高的版本
- 在第3部分使用Docker Compose作為描述
- 使用Docker Machine,這一步在 Docker for Mac 和 Docker for Windows 部分已經(jīng)安裝過了妒貌,但是在Linux系統(tǒng)上,你需要直接安裝颊郎,在沒有Hyper-V的Windows10預(yù)覽版以及WIndow10家庭版敞斋,使用Docker toolbox
- 閱讀第一部分指南
- 在第二部分學(xué)習(xí)如何創(chuàng)建容器
- 確保你已經(jīng)把創(chuàng)建的 名為 friendlyhello 鏡像推送到了注冊表,我們將在這里使用共享的這個鏡像
- 確保你的鏡像作為已部署的容器盏浇,運行這個命令锋勺,鍵入你的用戶名蚀瘸,倉庫 和標(biāo)記
docker run -p 80:80 username/repo:tag
然后訪問http://localhost/
- 順便從第三部分拷貝你的
docker-compose.yml
介紹
在第三部分,你獲得了第二部分寫的應(yīng)用庶橱,通過將其轉(zhuǎn)為服務(wù)贮勃,定義了它在生產(chǎn)中的運行方式,并將其擴(kuò)展到五倍苏章。
在這第四部分寂嘉,你把這個應(yīng)用部署到集群上,讓它在多個機(jī)器上運行枫绅。通過使用群組使多容器多設(shè)備應(yīng)用成為可能泉孩,群組就是把多個設(shè)備連接成Docker化的集群。
了解群集
一個群組使是運行docker的一組機(jī)器撑瞧,并把這些機(jī)器鏈接成一個集群棵譬。自那以后,你可以繼續(xù)像以前那樣運行docker命令预伺,但是現(xiàn)在是被群組管理執(zhí)行在一個集群上订咸。
群組管理員可以使用幾個策略運行容器,比如空節(jié)點-將會使用容器填充最少可用的機(jī)器酬诀,或者 全部 這會保證每一個機(jī)器都會得到一個特定容器的實例脏嚷。你可以在 Compose文件中編輯這些策略,就像之前你已經(jīng)使用的那個瞒御。
群組管理員就是群組中的一個機(jī)器父叙,你可以用它執(zhí)行你的命令,授權(quán)其他機(jī)器作為工作人員加入群組肴裙,工作人員僅僅提供能力趾唱,沒有權(quán)限去告訴其他機(jī)器什么可以做什么不可以做。
到目前為止蜻懦,你已經(jīng)在你的本機(jī)上使用單一主機(jī)模式使用了Docker甜癞,但是Docker也可以切換到群組模式。那就是使用群組宛乃。立即使用群組悠咱,讓你當(dāng)前的機(jī)器成為一個群組管理員。
這樣征炼,Docker將會在你管理的群組上執(zhí)行命令析既,而不是只在當(dāng)前的機(jī)器上。
啟動群組
一個群組由多個節(jié)點組成谆奥,這些節(jié)點可以是物理機(jī)也可以是虛擬機(jī)眼坏。最基本的原理相當(dāng)簡單:執(zhí)行docker swarm init
來啟動群組模式并且讓當(dāng)前的機(jī)器成為群組管理者,
然后在其他機(jī)器上運行 docker swarm join
使他們作為工作人員加入群組酸些。在下面選擇一個標(biāo)簽來看它是如何在不同的環(huán)境中運行的宰译。我們將使用虛擬機(jī)快速創(chuàng)建兩個機(jī)器群集并且把它轉(zhuǎn)換成群組。
創(chuàng)建一個集群
以 Mac Linux Windows7 和 Windows8 為例
本機(jī)上的虛擬機(jī)(Mac Linux Windows7 和 Windows8 )
第一步擂仍, 你需要一個可以安裝虛擬機(jī)的管理程序囤屹,因此可以為您的機(jī)器的操作系統(tǒng)安裝Oracle VirtualBox。
注意:如果您在Windows系統(tǒng)上安裝了Hyper-V逢渔,例如Windows 10肋坚,則不需要安裝VirtualBox,您應(yīng)該使用Hyper-V肃廓。 通過單擊上面的Hyper-V選項卡查看Hyper-V系統(tǒng)的說明智厌。 如果您使用Docker Toolbox,您應(yīng)該已經(jīng)安裝了VirtualBox作為其一部分盲赊,所以你可以開始了铣鹏。
現(xiàn)在 使用docker-machine
創(chuàng)建幾個虛擬機(jī),使用VirtualBox作為驅(qū)動
docker-machine create --driver virtualbox myvm1
docker-machine create --driver virtualbox myvm2
列出虛擬機(jī) 并且獲取 ip地址
你已經(jīng)創(chuàng)建了兩個虛擬機(jī)了哀蘑,名字為myvm1
和 myvm2
docker-machine ls
這是這個命令的輸出
$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
myvm1 - virtualbox Running tcp://192.168.99.100:2376 v17.06.2-ce
myvm2 - virtualbox Running tcp://192.168.99.101:2376 v17.06.2-ce
初始化群組 添加 節(jié)點
第一個機(jī)器將會作為一個管理員诚卸,用它來執(zhí)行管理員命令葵第,授權(quán)其他工作人員加入群組,第二個機(jī)器將會成為一個工作人員合溺。
使用使用 docker-machine ssh
向你的虛擬機(jī)發(fā)送指令卒密。使用 docker swarm init
指示 myvm1
成為一個群組管理員,你將會看到像下面那樣的輸出:
$ docker-machine ssh myvm1 "docker swarm init --advertise-addr <myvm1 ip>"
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> \
<myvm ip>:<port>
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
端口:2377 和 2376
總是使用2377端口(群組管理端口)運行docker swarm init
和docker swarm join
,或者根本不給出端口號棠赛,讓他采用默認(rèn)值哮奇。
使用docker-machine ls
將會返回包括2376端口的機(jī)器ip地址,2376端口是Docker后臺駐留端口睛约。不要使用這個端口鼎俘,否則可能會出錯。
正如你所看到的辩涝, docker swarm init
的響應(yīng) 為你 包含了一個 預(yù)置命令 docker swarm join
讓你添加想要的節(jié)點贸伐。拷貝這個命令膀值,然后通過docker-machine ssh
把它發(fā)送給 myvm2
讓 myvm2
作為工作人員加入你的新群組:
$ docker-machine ssh myvm2 "docker swarm join \
--token <token> \
<ip>:2377"
This node joined a swarm as a worker.
恭喜你棍丐,你已經(jīng)創(chuàng)建了你的第一個群組。
使用管理員運行docker node ls
來查看這個集群上的節(jié)點沧踏。
$ docker-machine ssh myvm1 "docker node ls"
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
brtu9urxwfd5j0zrmkubhpkbd myvm2 Ready Active
rihwohkh3ph38fhillhhb84sk * myvm1 Ready Active Leader
離開群組
如果你想要重新開始歌逢,你可以是從每個節(jié)點運行docker swarm leave
將你的應(yīng)用部署到群集
最難的部分已經(jīng)結(jié)束了。現(xiàn)在你可以重復(fù)之前在第三部分的操作翘狱,來在新的群組上部署秘案。只要記住只有像myvm1那樣的管理員才可以執(zhí)行Docker命令,工作人員只是提供能力的潦匈。
給群組管理員配置一個docker-machine
到目前為止阱高,你一直在 docker-machine ssh
打包docker命令 來告訴 虛擬機(jī)。另外一個選項就是 運行 docker-machine env <machine>
來獲取和運行你在當(dāng)前shell配置的命令 來告訴虛擬機(jī)上的Docker守護(hù)程序茬缩。下面的方法更好用赤惊。因為他允許你使用你本地的docker-compose.yml
文件來遠(yuǎn)程部署應(yīng)用,而無需將其拷貝到任何位置凰锡。
鍵入docker-machine env myvm1
然后賦值粘貼 輸出的最后一行命令 來配置你的 shell 和 群組管理員 myvm1 進(jìn)行通訊未舟。
環(huán)境不同 配置shell的命令也是不一樣的 這取決于你的電腦是 Mac Linux 或是 Windows 下面這個標(biāo)簽有例子。
我只列出了 Mac 和 Linux 的命令
運行 docker-machine env myvm1
來獲取命令掂为,用來配置你的shell 和 myvm1通訊
$ docker-machine env myvm1
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/Users/sam/.docker/machine/machines/myvm1"
export DOCKER_MACHINE_NAME="myvm1"
# Run this command to configure your shell:
# eval $(docker-machine env myvm1)
運行給出的命令來配置shell和myvm1通訊
eval $(docker-machine env myvm1)
運行 docker-machine ls
來檢驗下 myvm1 是當(dāng)前激活的機(jī)器裕膀,后面后面會有*作為標(biāo)示。
$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
myvm1 * virtualbox Running tcp://192.168.99.100:2376 v17.06.2-ce
myvm2 - virtualbox Running tcp://192.168.99.101:2376 v17.06.2-ce
在集群管理器上部署應(yīng)用
既然你已經(jīng)有了 myvm1 勇哗,你可以使用它作為管理員的能力來部署你的應(yīng)用昼扛。你可以使用和第三部同樣的命令 docker stack deploy
以及本地復(fù)制的 docker-stack.yml
.
你已經(jīng)通過docker-machine
shell配置 連接到了myvm1,你也有可以獲取本地主機(jī)上的文件。確保你和以前一樣欲诺,處在同一個目錄中抄谐。這個目錄包含在第三部分創(chuàng)建的docker-compose.yml
就像以前那樣渺鹦,運行下面的命令 在 myvm1上部署你的應(yīng)用
docker stack deploy -c docker-compose.yml getstartedlab
這樣,應(yīng)用就部署到了一個群組集群上斯稳。
現(xiàn)在 你可以使用和第三部分一樣的命令海铆。只是這一次迹恐,你會看到服務(wù)(和相關(guān)的容器)已經(jīng)分配到myvm1和myvm2
$ docker stack ps getstartedlab
ID NAME IMAGE NODE DESIRED STATE
jq2g3qp8nzwx getstartedlab_web.1 john/get-started:part2 myvm1 Running
88wgshobzoxl getstartedlab_web.2 john/get-started:part2 myvm2 Running
vbb1qbkb0o2z getstartedlab_web.3 john/get-started:part2 myvm2 Running
ghii74p9budx getstartedlab_web.4 john/get-started:part2 myvm1 Running
0prmarhavs87 getstartedlab_web.5 john/get-started:part2 myvm2 Running
使用
docker-machine env
和docker-machine ssh
鏈接虛擬機(jī)
- 要將shell設(shè)置為與不同的機(jī)器通話 比如myvm2挣惰,只需在相同或不同的shell中重新運行docker-machine env,
然后運行給定的命令來指向myvm2殴边。 這只是限定在當(dāng)前的shell憎茂。 如果更改為未配置的shell或打開新的shell,則需要重新運行命令锤岸。
使用docker-machine ls來列出機(jī)器竖幔,看看它們處于什么狀態(tài),獲取IP地址是偷,并找出連接到那個(如果存在的話)拳氢。 要了解更多信息,請參閱Docker Machine入門主題蛋铆。- 此外馋评,您可以用
docker-machine ssh <machine>“<command>”
的形式封裝Docker命令,該命令直接登錄到VM中刺啦,但不能立即訪問本地主機(jī)上的文件留特。- 在 Mac 和 Linux 電腦上,你可以使用
docker-machine scp <file> <machine>:~
來在機(jī)器之間復(fù)制文件玛瘸,但是Windows用戶需要用Git Bash這樣的Linux終端模擬器才可以蜕青。本教程演示了docker-machine ssh和docker-machine env,因為這些都可以通過docker-machine CLI在所有平臺上使用糊渊。
連接你的集群
您可以從myvm1或myvm2的IP地址訪問您的應(yīng)用程序右核。
您創(chuàng)建的網(wǎng)絡(luò)在它們之間共享,并且負(fù)載平衡.運行docker-machine ls來獲取您的虛擬機(jī)的IP地址渺绒,并在瀏覽器上訪問它們贺喝,點擊刷新(或是在終端curl)。
您會看到五個可能的容器ID芒篷,它們都隨機(jī)循環(huán)搜变,顯示了負(fù)載平衡。
IP地址工作的原因是群集中的節(jié)點參與入口路由網(wǎng)格针炉。這樣可以確保在群集中某個端口部署的服務(wù)始終將該端口保留給自己挠他,無論實際運行什么節(jié)點的容器
下圖是個示意圖。一個路由網(wǎng)絡(luò)是如何為服務(wù)工作的篡帕,這個服務(wù)名字叫 my-web 它是一個三節(jié)點群組 部署在8080端口上殖侵。
鏈接有問題贸呢?
請記住,為了在群集中使用入口網(wǎng)絡(luò)拢军,在啟用群組模式之前楞陷,需要在群集節(jié)點之間打開以下端口:
- 端口7946 TCP / UDP用于容器網(wǎng)絡(luò)發(fā)現(xiàn)。
- 端口4789 UDP用于容器入口網(wǎng)絡(luò)茉唉。
迭代和縮放你的應(yīng)用
在這里固蛾,你可以做你在第二部分和第三部分學(xué)到的一切東西。
使用更改 docker-compose.yml
文件來縮放你的應(yīng)用度陆。
通過編輯代碼艾凯,然后重新編譯,然后發(fā)布新的鏡像懂傀,來改變應(yīng)用的行為(要做到這一點趾诗,請按照您之前采用的步驟來構(gòu)建應(yīng)用程序并發(fā)布鏡像)。
無論哪種情況蹬蚁,只需運行docker stack再次部署這些更改恃泪。
你可以使用在myvm2上使用的docker swarm join
命令 來加入任意的機(jī)器(物理機(jī),虛擬機(jī))到群組犀斋,能力會添加到集群中贝乎。
稍后運行docker stack部署,您的應(yīng)用程序?qū)⑹褂眯碌馁Y源闪水。
清理和重啟
堆疊和群組
您可以用docker stack rm移除堆疊糕非。 例如:
docker stack rm getstartedlab
卸載 docker-machine shell 變量設(shè)置
您可以在當(dāng)前shell中使用以下命令取消設(shè)置docker-machine環(huán)境變量:
eval $(docker-machine env -u)
這和虛擬機(jī)創(chuàng)建的docker-machine中是shell斷開了鏈接。并且允許你繼續(xù)在當(dāng)前的shell中工作球榆,現(xiàn)在使用本地原生的docker 命令朽肥。
要了解更多信息,請參閱關(guān)于取消設(shè)置環(huán)境變量的機(jī)器主題持钉。
重啟 docker 機(jī)器
如果你關(guān)閉了本地主機(jī)衡招,Docker機(jī)器就會停止運行。你可以通過 docker-machine ls
來檢查機(jī)器的狀態(tài)
$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
myvm1 - virtualbox Stopped Unknown
myvm2 - virtualbox Stopped Unknown
要重新啟動已經(jīng)停止運行的機(jī)器每强,運行下面的命令:
docker-machine start <machine-name>
例如:
$ docker-machine start myvm1
Starting "myvm1"...
(myvm1) Check network to re-create if needed...
(myvm1) Waiting for an IP...
Machine "myvm1" was started.
Waiting for SSH to be available...
Detecting the provisioner...
Started machines may have new IP addresses. You may need to re-run the `docker-machine env` command.
$ docker-machine start myvm2
Starting "myvm2"...
(myvm2) Check network to re-create if needed...
(myvm2) Waiting for an IP...
Machine "myvm2" was started.
Waiting for SSH to be available...
Detecting the provisioner...
Started machines may have new IP addresses. You may need to re-run the `docker-machine env` command.
回顧
在第4部分中始腾,您知道了群體是什么,群組中的節(jié)點是如何成為管理員或工作人員的空执,創(chuàng)建群組浪箭,并在其上部署應(yīng)用程序。
你看到Docker的核心命令沒有從第3部分改變辨绊,他們只需要在群組主機(jī)上運行奶栖。
您也看到了Docker網(wǎng)絡(luò)的強(qiáng)大功能,即使它們在不同的機(jī)器上運行,這些功能也可以在容器之間進(jìn)行負(fù)載平衡宣鄙。
最后袍镀,您學(xué)習(xí)了如何在集群上迭代和擴(kuò)展應(yīng)用程序。
這里有一些你和群組交互時可能會用到的命令:
docker-machine創(chuàng)建--driver virtualbox myvm1#創(chuàng)建一個虛擬機(jī)(Mac冻晤,Win7苇羡,Linux)
docker-machine create -d hyperv --hyperv-virtual-switch“myswitch”myvm1#Win10
docker-machine env myvm1#查看有關(guān)您節(jié)點的基本信息
docker-machine ssh myvm1“docker node ls”#列出你的群集中的節(jié)點
docker-machine ssh myvm1“docker node inspect <node ID>”#檢查節(jié)點
docker-machine ssh myvm1“docker swarm join-token -q worker”#查看連接令牌
docker-machine ssh myvm1#與虛擬機(jī)打開SSH會話;鍵入“退出”結(jié)束
docker-machine ssh myvm2“docker swarm leave”#讓工作人員離開群集
docker-machine ssh myvm1“docker swarm leave -f”#讓主人離開,關(guān)閉群組
docker-machine啟動myvm1#啟動當(dāng)前未運行的虛擬機(jī)
docker-machine stop $(docker-machine ls -q)#停止所有正在運行的虛擬機(jī)
docker-machine rm $(docker-machine ls -q)#刪除所有虛擬機(jī)及其磁盤映像
docker-machine scp docker-compose.yml myvm1:?#將文件復(fù)制到節(jié)點的home目錄
docker-machine ssh myvm1“docker stack deploy -c <file> <app>”#部署應(yīng)用程序