了解Swarm集群
Swarm集群是一組運(yùn)行Docker并加入集群的計算機(jī)悦屏。但現(xiàn)在它們由集群管理器控制在集群上執(zhí)行三痰。群中的機(jī)器可以是物理的或虛擬的。加入群組后窜管,它們被稱為節(jié)點(diǎn)。
Swarm管理器可以使用多種策略來運(yùn)行容器稚机,例如“emptiest node” - 它使用容器利用率最低的機(jī)器幕帆。或“global”赖条,它確保每臺機(jī)器只獲得指定容器的一個實例失乾。您可以使用Compose文件指定這些策略。
Swarm管理器是群中唯一可以執(zhí)行命令的機(jī)器纬乍,或授權(quán)其他機(jī)器作為worker加入Swarm管理器碱茁。worker只是在那里提供工作能力,沒有權(quán)力告訴任何其他機(jī)器能做什么和不能做什么仿贬。
到目前為止纽竣,一直在本地計算機(jī)上以單主機(jī)模式使用Docker。但Docker也可以切換到swarm模式茧泪,這就是使用群集的原因蜓氨。立即啟用Swarm集群模式使當(dāng)前計算機(jī)成為swarm管理器。從現(xiàn)在起队伟,Docker指令就會運(yùn)行在swarm集群上穴吹,而不僅僅是在當(dāng)前機(jī)器上。
開啟集群模式
群由多個節(jié)點(diǎn)組成嗜侮,可以是物理或虛擬機(jī)港令∩度荩基本概念很簡單:運(yùn)行docker swarm init
以啟用swarm模式并使當(dāng)前計算機(jī)成為一個swarm管理器,然后在其他計算機(jī)上運(yùn)行docker swarm join
以使它們作為worker加入swarm顷霹。我們使用VM快速創(chuàng)建一個雙機(jī)群集并將其轉(zhuǎn)換為swarm集群咪惠。
創(chuàng)建一個集群
本地計算機(jī)上的VM(MAC硝逢,LINUX,WINDOWS 7和8)
您需要一個可以創(chuàng)建虛擬機(jī)(VM)的虛擬機(jī)管理程序绅喉,因此為您的計算機(jī)操作系統(tǒng)安裝Oracle VirtualBox渠鸽。
注意:如果您使用的是安裝了Hyper-V的Windows系統(tǒng)(如Windows 10),則無需安裝VirtualBox柴罐,而應(yīng)使用Hyper-V徽缚。如果你使用的是Docker Toolbox,你應(yīng)該已經(jīng)安裝了VirtualBox作為其中的一部分革屠。就不用安裝了凿试。
現(xiàn)在,docker-machine
使用VirtualBox驅(qū)動程序創(chuàng)建幾個VM :
docker-machine create --driver virtualbox myvm1
docker-machine create --driver virtualbox myvm2
本地計算機(jī)上的VM(WINDOWS 10)
首先似芝,快速創(chuàng)建虛擬交換機(jī)以供虛擬機(jī)(VM)共享那婉,以便它們可以相互連接。
- 啟動Hyper-V管理器
- 單擊右側(cè)菜單中的虛擬交換機(jī)管理器
- 單擊新建虛擬網(wǎng)絡(luò)交換機(jī),類型為外部
- 為其命名
myswitch
党瓮,然后選中該框以共享主機(jī)的活動網(wǎng)絡(luò)適配器
現(xiàn)在详炬,使用我們的節(jié)點(diǎn)管理工具創(chuàng)建幾個VM docker-machine
:
注意:您需要以管理員身份運(yùn)行以下命令,否則您無權(quán)創(chuàng)建hyperv VM寞奸!
docker-machine create -d hyperv --hyperv-virtual-switch "myswitch" myvm1
docker-machine create -d hyperv --hyperv-virtual-switch "myswitch" myvm2
列出虛擬機(jī)并獲取其IP地址
您現(xiàn)在創(chuàng)建了兩個名為myvm1
和的VM myvm2
呛谜。
使用此命令列出計算機(jī)并獲取其IP地址。
注意:您需要以管理員身份運(yùn)行以下命令枪萄,否則您將無法獲得合理的輸出(僅“未知”)隐岛。
docker-machine ls
以下是此命令的示例輸出。
C:\Windows\system32>docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
myvm1 - hyperv Running tcp://192.168.1.100:2376 v18.09.6
myvm2 - hyperv Running tcp://192.168.1.102:2376 v18.09.6
初始化SWARM并添加節(jié)點(diǎn)
第一臺機(jī)器充當(dāng)管理器瓷翻,它執(zhí)行管理命令并驗證worker加入群聚凹,第二臺是worker。
您可以使用命令docker-machine ssh
向VM發(fā)送命令齐帚。使myvm1
成為一個swarm管理器即在myvm1
上執(zhí)行docker swarm init
并查找如下輸出:
docker-machine ssh myvm1 "docker swarm init --advertise-addr <myvm1 ip>"
C:\Windows\system32>docker-machine ssh myvm1 "docker swarm init --advertise-addr 192.168.1.100"
Swarm initialized: current node (dvlpu7zv6kkwg2qr3dpa0sk3k) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-4x24xi9xtm4pbu42py3fugh2lee1cekodzy8rt8e82nq99rtgh-00i3d8t9sh6445n4akxe71zkf 192.168.1.100:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
C:\Windows\system32>
端口2377和2376
docker swarm init
和docker swarm join
使用端口2377(集群管理端口)元践,沒有給定端口的時候,使用這個默認(rèn)值童谒。
docker-machine ls
返回的計算機(jī)IP地址包含端口2376 单旁,即Docker守護(hù)程序端口。請勿使用此端口饥伊,否則 您可能會遇到錯誤象浑。
使用SSH時遇到問題蔫饰?試試--native-ssh標(biāo)志
Docker Machine 可以讓您使用自己系統(tǒng)的SSH,如果由于某種原因您無法向Swarm管理器發(fā)送命令愉豺。只需
--native-ssh
在調(diào)用ssh
命令時指定 標(biāo)志:docker-machine --native-ssh ssh myvm1 ...
如您所見篓吁,響應(yīng)docker swarm init
包含一個預(yù)先配置的 docker swarm join
命令,您可以在要添加的任何節(jié)點(diǎn)上運(yùn)行該命令蚪拦。復(fù)制此命令杖剪,并將其發(fā)送到myvm2
比如 docker-machine ssh
將myvm2
作為worker加入到swarm集群:
$ docker-machine ssh myvm2 "docker swarm join \
--token <token> \
<ip>:2377"
This node joined a swarm as a worker.
示例輸出:
C:\Windows\system32>docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
myvm1 - hyperv Running tcp://192.168.1.100:2376 v18.09.6
myvm2 - hyperv Running tcp://192.168.1.102:2376 v18.09.6
C:\Windows\system32>docker-machine ssh myvm1 "docker swarm init --advertise-addr 192.168.1.100"
Swarm initialized: current node (dvlpu7zv6kkwg2qr3dpa0sk3k) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-4x24xi9xtm4pbu42py3fugh2lee1cekodzy8rt8e82nq99rtgh-00i3d8t9sh6445n4akxe71zkf 192.168.1.100:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
C:\Windows\system32>docker-machine ssh myvm2 "docker swarm join --token SWMTKN-1-4x24xi9xtm4pbu42py3fugh2lee1cekodzy8rt8e82nq99rtgh-00i3d8t9sh6445n4akxe71zkf 192.168.1.100:2377"
This node joined a swarm as a worker.
萬一token 被清除了咋辦?執(zhí)行docker swarm join-token worker|manager
命令:
PS F:\dockerExample> docker-machine ssh myvm1 "docker swarm join-token worker"
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-3oarvifh2gcrbogkim66wj9enk0exh5r3jn1oagqrpp6tynds6-1wcidoxi0hilmuxgrvw0tdu8n 192.168.1.100:2377
PS F:\dockerExample>
恭喜你驰贷,你已經(jīng)創(chuàng)建了你的第一個集群盛嘿!
使用docker node ls
在swarm管理器上運(yùn)行以查看此群中的節(jié)點(diǎn):
C:\Windows\system32>docker node ls
Error response from daemon: This node is not a swarm manager. Use "docker swarm init" or "docker swarm join" to connect this node to swarm and try again.
C:\Windows\system32>docker-machine ssh myvm1 "docker node ls"
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
dvlpu7zv6kkwg2qr3dpa0sk3k * myvm1 Ready Active Leader 18.09.6
gvhr76swgxf98i22lzilrbq3f myvm2 Ready Active 18.09.6
離開集群
可以在節(jié)點(diǎn)上運(yùn)行
docker swarm leave
C:\Windows\system32>docker-machine ssh myvm2 "docker swarm leave"
Node left the swarm.
C:\Windows\system32>docker-machine ssh myvm1 "docker node ls"
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
dvlpu7zv6kkwg2qr3dpa0sk3k * myvm1 Ready Active Leader 18.09.6
gvhr76swgxf98i22lzilrbq3f myvm2 Down Active 18.09.6
# 可以看到不是真的離開了集群,只是狀態(tài)變?yōu)镈own了括袒,重新連一下:
PS F:\dockerExample> docker-machine ssh myvm2 "docker swarm join --token SWMTKN-1-3oarvifh2gcrbogkim66wj9enk0exh5r3jn1oagqrpp6tynds6-1wcidoxi0hilmuxgrvw0tdu8n 192.168.1.100:2377"
This node joined a swarm as a worker.
PS F:\dockerExample> docker-machine ssh myvm1 "docker node ls"
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
w4pvuf32jsatq0q8g89tq5sm8 * myvm1 Ready Active Leader 18.09.6
pxl1s3glvsxmdg14c5sj3w2bh myvm2 Ready Active 18.09.6
qr2nfew2478b5wriz7d3edxow myvm2 Down Active 18.09.6
PS F:\dockerExample> docker-machine ssh myvm1 "docker node rm myvm2"
Error response from daemon: node myvm2 is ambiguous (2 matches found)
exit status 1
# 多了一個myvm2次兆,狀態(tài)為Down,作為一個強(qiáng)迫癥锹锰,我要刪除它
PS F:\dockerExample> docker-machine ssh myvm1 "docker node rm qr2nfew2478b5wriz7d3edxow"
qr2nfew2478b5wriz7d3edxow
PS F:\dockerExample> docker-machine ssh myvm1 "docker node ls"
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
w4pvuf32jsatq0q8g89tq5sm8 * myvm1 Ready Active Leader 18.09.6
pxl1s3glvsxmdg14c5sj3w2bh myvm2 Ready Active 18.09.6
計算機(jī)異常關(guān)機(jī)了芥炭,或者說正常重啟之后,通過hyper-v創(chuàng)建的虛擬機(jī)地址變了咋辦恃慧?
其實在創(chuàng)建完成虛擬機(jī)之后就給它設(shè)置靜態(tài)ip园蝠,通過本教程創(chuàng)建的虛擬機(jī)的操作系統(tǒng)類型是tinycorelinux
如果想給他配置靜態(tài)ip,可以執(zhí)行docker-machine ssh myvm*
去修改網(wǎng)絡(luò)配置文件痢士,但是很不幸彪薛,我沒找到相關(guān)資料徽职,所以我決定刪除它們,通過docker-machine rm myvm*
刪除虛擬機(jī)勉耀,如果報錯exit code 1 之類的話荣赶,執(zhí)行docker-machine rm -f myvm*
,再去hyper-v管理器中手動刪除虛擬機(jī)褥蚯,再重新創(chuàng)建一邊就好,當(dāng)然况增,你如果找到了tinycorelinux的網(wǎng)絡(luò)配置文件赞庶,也可以跟我說一下
在群集群集上部署您的應(yīng)用程序
請記住,Swarm管理器
myvm1
才能執(zhí)行Docker命令; woker只是為了干活澳骤。
使用docker-machine
為swarm管理器配置shell
到目前為止歧强,我們都是通過docker-machine ssh
命令與VM通信中。另一種更方便的方式是執(zhí)行docker-machine env <machine>
獲取一個命令为肮,該命令將當(dāng)前shell配置為與VM上的Docker守護(hù)程序通信摊册,即將當(dāng)前命令行的輸入轉(zhuǎn)發(fā)到虛擬機(jī)執(zhí)行。在執(zhí)行下一步之前颊艳,最好執(zhí)行這個命令茅特,因為它允許您使用本地docker-compose.yml
文件“遠(yuǎn)程”部署應(yīng)用程序忘分,而無需將該文件復(fù)制到虛擬機(jī)
鍵入docker-machine env myvm1
,復(fù)制輸出的最后一行提供的命令并運(yùn)行白修,以配置要與之通信的shell(myvm1
swarm管理器)妒峦。記住,只有swarm管理器才能執(zhí)行docker命令兵睛,worker 只是干活的
配置shell的命令在Mac肯骇,Linux或Windows上是不同的
MAC或LINUX上的Docker 配置shell
運(yùn)行docker-machine env myvm1命令獲取與 myvm1配置shell的命令。
$ docker-machine env myvm1
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.1.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)
WINDOWS上的DOCKER機(jī)器SHELL環(huán)境
運(yùn)行docker-machine env myvm1命令獲取與 myvm1配置shell的命令祖很。
PS C:\Users\sam\sandbox\get-started> docker-machine env myvm1
$Env:DOCKER_TLS_VERIFY = "1"
$Env:DOCKER_HOST = "tcp://192.168.203.207:2376"
$Env:DOCKER_CERT_PATH = "C:\Users\sam\.docker\machine\machines\myvm1"
$Env:DOCKER_MACHINE_NAME = "myvm1"
$Env:COMPOSE_CONVERT_WINDOWS_PATHS = "true"
# Run this command to configure your shell:
# & "C:\Program Files\Docker\Docker\Resources\bin\docker-machine.exe" env myvm1 | Invoke-Expression
運(yùn)行給定命令來配置與myvm1
通信的shell 笛丙。
& "C:\Program Files\Docker\Docker\Resources\bin\docker-machine.exe" env myvm1 | Invoke-Expression
運(yùn)行docker-machine ls
來驗證myvm1
是活動計算機(jī)(Active列為*)。
PS C:PATH> docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
myvm1 * hyperv Running tcp://192.168.203.207:2376 v17.06.2-ce
myvm2 - hyperv Running tcp://192.168.200.181:2376 v17.06.2-ce
在swarm管理器上部署應(yīng)用程序
現(xiàn)在你配置了本地shell連接到myvm1
突琳,您可以使用本地shell作為Swarm管理器若债,它現(xiàn)在也可以訪問你本地計算機(jī)上的文件,通過使用docker stack deploy
命令以及本地docker-compose.yml
文件來部署您的應(yīng)用程序拆融。部署需要一些時間才能完成蠢琳。使用docker service ps <service_name>
命令驗證是否已部署所有服務(wù)。
與以前一樣镜豹,運(yùn)行以下命令部署應(yīng)用程序:
docker stack deploy --with-registry-auth -c docker-compose.yml getstartedlab
就是這樣傲须,應(yīng)用程序部署在一個多機(jī)集群中!
注意:如果您的映像存儲在私有倉庫而不是Docker Hub上趟脂,則需要使用登錄
docker login <your-registry>
泰讽,然后需要將--with-registry-auth
標(biāo)志添加到部署命令中。例如:docker login registry.example.com docker stack deploy --with-registry-auth -c docker-compose.yml getstartedlab
這會使用加密的WAL日志將登錄令牌從本地客戶端傳遞到部署服務(wù)的swarm節(jié)點(diǎn)昔期。有了這些信息已卸,節(jié)點(diǎn)就可以登錄注冊表并提取圖像。
現(xiàn)在硼一,您可以使用docker stack ps getstartedlab
命令查看堆的狀態(tài)累澡。只是這一次的服務(wù)(和相關(guān)容器)已經(jīng)在myvm1
和myvm2
兩者上都有部署。
$ docker stack ps getstartedlab
ID NAME IMAGE NODE DESIRED STATE
jq2g3qp8nzwx getstartedlab_web.1 gordon/get-started:part2 myvm1 Running
88wgshobzoxl getstartedlab_web.2 gordon/get-started:part2 myvm2 Running
vbb1qbkb0o2z getstartedlab_web.3 gordon/get-started:part2 myvm2 Running
ghii74p9budx getstartedlab_web.4 gordon/get-started:part2 myvm1 Running
0prmarhavs87 getstartedlab_web.5 gordon/get-started:part2 myvm2 Running
使用
docker-machine env
和docker-machine ssh
連接到VM
- 要將shell設(shè)置為與其他機(jī)器通信般贼,只需將命令
docker-machine env <machine>
輸出的最后一行命令愧哟,在相同或不同的shell中運(yùn)行。這始終特定于當(dāng)前shell哼蛆。如果更改為未配置的shell或重新打開的shell蕊梧,則需要重新運(yùn)行。
- 或者腮介,使用命令
docker-machine ssh <machine> "<command>"
直接發(fā)送到VM中肥矢,但不能訪問本地主機(jī)上的文件。你需要用scp命令或者類似的遠(yuǎn)程拷貝工具來拷貝本地文件到遠(yuǎn)程
- 在Mac和Linux上叠洗,您可以使用
docker-machine scp <file> <machine>:~
跨機(jī)器復(fù)制文件橄抹,但Windows用戶需要像Git Bash這樣的Linux終端模擬器才能正常執(zhí)行靴迫。本教程演示的
docker-machine ssh
和docker-machine env
,他們可以在任何平臺執(zhí)行
訪問集群上的應(yīng)用
你可以用myvm1
或myvm2
的IP地址來訪問你的應(yīng)用程序 楼誓。
它們之間共享網(wǎng)絡(luò)并進(jìn)行負(fù)載均衡玉锌。運(yùn)行 docker-machine ls
獲取VM的IP地址,并在瀏覽器上訪問其中任何一個疟羹,點(diǎn)擊刷新(或者執(zhí)行curl
命令)主守。
HostName有五種可能,都是五個容器ID中的一個榄融,這表明進(jìn)行了負(fù)載均衡参淫。
兩個IP地址都可以正常訪問的原因是群中的節(jié)點(diǎn)都加入了路由網(wǎng)格。這可確無論實際運(yùn)行容器的是哪個節(jié)點(diǎn)愧杯,部署在swarm中某個端口的服務(wù)始終將該端口保留給自身涎才,下面是一個圖表,說明在三節(jié)點(diǎn)群上上發(fā)布的端口為8080
的my-web
服務(wù)的路由網(wǎng)格:
連接時候出了問題力九?
請記住耍铜,要在群集中使用ingress network,您需要在啟用群集模式之前在群集節(jié)點(diǎn)之間打開以下端口:
- 端口7946 TCP / UDP用于容器網(wǎng)絡(luò)發(fā)現(xiàn)跌前。
- 端口4789 UDP 用于容器ingress network棕兼。
仔細(xì)檢查您的Web服務(wù)端口,并確保您在瀏覽器中輸入的IP地址正確
迭代和擴(kuò)展您的應(yīng)用程序
通過更改docker-compose.yml
文件來擴(kuò)展應(yīng)用程序抵乓。
通過編輯代碼伴挚,可以重建并推送新圖像來更改應(yīng)用程序行為。
在任何情況下灾炭,只需再次運(yùn)行docker stack deploy
即可部署這些更改茎芋。
您可以使用docker swarm join
命令將任何計算機(jī)(物理或虛擬)加入這個集群,并將容量添加到群集中蜈出。只需在之后運(yùn)行docker stack deploy
田弥,您的應(yīng)用就會部署到新的節(jié)點(diǎn)。
清理并重新啟動
stack和swarm
你可以docker stack rm
從stack中停止服務(wù)掏缎。例如:
docker stack rm getstartedlab
如何從群中移除節(jié)點(diǎn)
如果你想從群里移除節(jié)點(diǎn)皱蹦,如果是worker煤杀,比如要移除myvm2節(jié)點(diǎn)眷蜈,可以執(zhí)行
docker-machine ssh myvm2 "docker swarm leave"
,如果是Swarm管理器沈自,比如myvm1酌儒,則執(zhí)行docker-machine ssh myvm1 "docker swarm leave --force"
取消設(shè)置docker-machine shell變量設(shè)置
您可以docker-machine
使用給定命令在當(dāng)前shell中取消環(huán)境變量設(shè)置。這樣當(dāng)前命令行就不會轉(zhuǎn)發(fā)命令給docker vm
在Mac或Linux上枯途,命令是:
eval $(docker-machine env -u)
在Windows上忌怎,命令是:
& "C:\Program Files\Docker\Docker\Resources\bin\docker-machine.exe" env -u | Invoke-Expression
這會使shell與docker-machine
創(chuàng)建的虛擬機(jī)斷開連接
重啟Docker機(jī)器
如果關(guān)閉本地主機(jī)籍滴,重啟后Docker創(chuàng)建的虛擬計算機(jī)將停止運(yùn)行。您可以通過運(yùn)行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ī)孽惰,請運(yùn)行:
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.