群組

這是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ī)了哀蘑,名字為myvm1myvm2

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 initdocker 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ā)送給 myvm2myvm2 作為工作人員加入你的新群組:

$ 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 envdocker-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)用程序

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鼻弧,一起剝皮案震驚了整個濱河市设江,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌温数,老刑警劉巖绣硝,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異撑刺,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)握玛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門够傍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人挠铲,你說我怎么就攤上這事冕屯。” “怎么了拂苹?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵安聘,是天一觀的道長。 經(jīng)常有香客問我瓢棒,道長浴韭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任脯宿,我火速辦了婚禮念颈,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘连霉。我一直安慰自己榴芳,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布跺撼。 她就那樣靜靜地躺著窟感,像睡著了一般。 火紅的嫁衣襯著肌膚如雪歉井。 梳的紋絲不亂的頭發(fā)上柿祈,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼谍夭。 笑死黑滴,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的紧索。 我是一名探鬼主播袁辈,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼珠漂!你這毒婦竟也來了晚缩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤媳危,失蹤者是張志新(化名)和其女友劉穎荞彼,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體待笑,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡鸣皂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了暮蹂。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片寞缝。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖仰泻,靈堂內(nèi)的尸體忽然破棺而出荆陆,到底是詐尸還是另有隱情,我是刑警寧澤集侯,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布被啼,位于F島的核電站,受9級特大地震影響棠枉,放射性物質(zhì)發(fā)生泄漏浓体。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一术健、第九天 我趴在偏房一處隱蔽的房頂上張望汹碱。 院中可真熱鬧,春花似錦荞估、人聲如沸咳促。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽跪腹。三九已至,卻和暖如春飞醉,著一層夾襖步出監(jiān)牢的瞬間冲茸,已是汗流浹背屯阀。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留轴术,地道東北人难衰。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像逗栽,于是被迫代替她去往敵國和親盖袭。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 注意: 該 Docker 版本為了支持 Docker 機(jī),于是不再支持 Boot2Docker 命令行彼宠。使用 Do...
    提莫隊長1234閱讀 4,590評論 0 8
  • 以下原文轉(zhuǎn)載于(https://docs.docker.com/docker-for-mac/)(想找中文版的最新...
    Veekend閱讀 7,546評論 0 17
  • 摘要:本文講的是使用Docker Swarm來運行服務(wù)【編者的話】本文介紹了Docker 1.12中的Docker...
    暖夏未眠丶閱讀 1,086評論 0 0
  • 今天天氣很好鳄虱,一如既往的讓人睜不開眼,但是我只喜歡在每個盛夏的午后干著自己喜歡的事情凭峡,不知道為什么會有一種莫...
    梓鳴同學(xué)閱讀 236評論 0 0
  • 36期親子班第6組-殷光琴 (張鎬然10歲)加油拙已! #口號(只有感覺好才能做得好) 孩子第四個30天目標(biāo): 1、英...
    yincarol琴閱讀 155評論 0 0