粘貼不了新的東西(粘貼突然不能用了)
612
2025-04-04
第四篇:Swarms
準備工作
·????? 安裝Docker版本1.13或更高版本。
·????? 安裝Docker compose。
·????? 安裝docker machine
·????? 閱讀第1 2 3部分的內容。
·????? 確保你已發布并推送到注冊倉庫的friendlyhello鏡像。
·????? 確保你的鏡像可以部署為一個容器。 運行這個命令,在你的信息中插入用戶名,repo和標簽:docker run -p 80:80 username / repo:tag,然后訪問http:// localhost /。
·????? 第3部分復制docker-compose.yml文件。
介紹
在第3部分中,介紹了你在第2部分中編寫的應用程序,并定義了它應該如何在生產環境中運行,將其轉化為服務,并在此過程中將其擴展5倍實例。
在第4部分中,將此應用程序部署到群集上,并在多臺機器上運行它。 通過將多臺機器連接到稱為swarm的“Dockerized”群集,使多容器,多機器應用成為可能。
理解Swarm clusters
Swarm是一組運行Docker并加入到集群中的機器。加入到集群中之后,你將繼續運行你習慣的Docker命令,但現在它現在在Docker Swarm的集群上執行。集群中的機器可以是物理的也可以是虛擬的。加入集群后,單個容器被稱為節點。
Swarm manager可以使用多種策略來運行容器,例如“emptiest node” - 它可以使用容器填充使用率最低的機器。或者“global”,它確保每臺機器只獲取指定容器的一個實例。swarm managerd的這些策略需要在Compose文件中指定。
Swarm manager是群體中唯一可以執行你的命令的機器,或者授權其他機器作為worker加入到群體中。workers只是在那里提供能力,并沒有權力告訴任何其他機器可以做什么和不可以做什么。
到目前為止,您已經在本地機器上以單主機模式使用Docker。但是Docker也可以切換到群集模式,這就是使用群集的原因。立即啟用群模式使當前的機器成為群管理器。從此,Docker將運行您在您管理的群集上執行的命令,而不僅僅是在當前機器上執行。
設置你的集群
一個swarm是由多個節點組成,節點可以是物理或者虛擬的機器。它的基本概念足夠簡單:運行docker swarm init 命令能夠開啟swarm模式,并且使你的當前機器成為swarm manager,運行docker swarm join命令能夠讓其他機器加入到 swarm 中成為worker機器。選擇的下面的選項卡,看看它是如何各自情況下發揮作用的。我們使用虛擬機快速創建一個雙機集群,并且將其變成swarm.
創建集群
你需需要一個可以創建虛擬機(VM)的虛擬機管理程序,因此請為你的計算機的操作系統安裝Oracle VirtualBox。
現在,創建兩個vm使用docker-machine ,使用VirtualBox 驅動:
docker-machine?create?--driver?virtualbox?myvm1
docker-machine?create?--driver?virtualbox?myvm2
查看vm列表并獲取們的ip地址
你現在有2個vms創建,名字為myvm1和myvm2。
$?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
初始化swarm 并且添加節點
第一個機器扮演的是manager的角色,它可以執行管理命令并且驗證worker 加入到 swarm中去,第二個是worker。
你可能發送命令到您的vms通過docker-machine ssh。指示myvm1成為一個擁有docker swarm init的swarm manager并輸出如下:
$?docker-machine?ssh?myvm1?"docker?swarm?init?--advertise-addr?
Swarm?initialized:?current?node?
To?add?a?worker?to?this?swarm,?run?the?following?command:
docker?swarm?join?\
--token?
To?add?a?manager?to?this?swarm,?run?'docker?swarm?join-token?manager'?and?follow?the?instructions.
如您所見,對docker swarm init的響應包含一個預配置的docker swarm join命令,您可以在要添加的任何節點上運行該命令。 復制這個命令,并通過docker-machine ssh將它發送到myvm2,讓myvm2作為一個worker加入你的新群體:
$?docker-machine?ssh?myvm2?"docker?swarm?join?\
--token?
This?node?joined?a?swarm?as?a?worker.
恭喜,你已經成功創建了你的第一個swarm。
運行docker node ls在manager機器上去查看swarm 中的節點:
$?docker-machine?ssh?myvm1?"docker?node?ls"
ID????????????????????????????HOSTNAME????????????STATUS??????????????AVAILABILITY????????MANAGER?STATUS
brtu9urxwfd5j0zrmkubhpkbd?????myvm2???????????????Ready???????????????Active
rihwohkh3ph38fhillhhb84sk?*???myvm1???????????????Ready???????????????Active??????????????Leader
發布你的應用到swarm cluster中去
最難的部分已經完結。現在你只需要重復再第三部分的過程將應用發布到你的swarm中去。請記住只有像myvm1這樣的群集管理器才能執行Docker命令; worker只是用來工作的。
配置一docker-machine命令成為swarm manager
到目前為止,你已經在Docker-machine ssh中將Docker命令包裝為與虛擬機交談。 另一種選擇是運行docker-machine env來獲取并運行一個命令,該命令將當前shell配置為與VM上的Docker守護進程進行通信。 此方法對下一步更好,因為它允許您使用本地docker-compose.yml文件“遠程”部署應用程序,而無需將其復制到任何位置。
鍵入docker-machine env myvm1,然后復制粘貼并運行作為輸出最后一行提供的命令,以將shell配置為與swarm管理器myvm1對話。
配置shell的命令根據你是Mac,Linux還是Windows而有所不同,因此下面的選項卡中顯示了每個命令的示例。
MAC或LINUX上的DOCKER MACHINE SHELL環境
運行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命令去校驗現在這個活動的機器,如旁邊的星號所示。:
$?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
在swarm manager中部署容器
現在你已經有了myvm1,你可以使用它的權利作為swarm manager器發布你的app通過使用第3部分中用于myvm1的相同docker stack deploy命令和docker-compose.yml的本地副本來部署您的應用程序。此命令可能需要幾秒鐘才能完成,部署的服務需要一段時間才能提供服務。在swarm管理器上使用docker service ps命令驗證所有服務是否已被重新部署。
你通過docker-machine shell配置連接到myvm1,并且你仍然可以訪問本地主機上的文件。 確保你和之前操作在同一個目錄下,其中包括你在第3部分中創建的docker-compose.yml文件。
和之前一樣,運行下面的命令在mym1機器上部署應用。
docker?stack?deploy?-c?docker-compose.yml?getstartedlab
正是這樣,應用在swarm 集群中國部署了!
現在,你可以使用第3部分中使用的相同docker命令。只有這一次,請注意,服務(及相關容器)已在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
訪問你的集群
你可以從myvm1或myvm2的IP地址訪問你的應用程序。
你創建的網絡在它們之間共享并負載平衡。 運行docker-machine ls來獲取虛擬機的IP地址,并在瀏覽器中訪問它們中的任何一個,并刷新(或者通過curl請求)。
有五個可能的容器ID全部隨機輪訓,來實現負載平衡。
兩個IP地址工作的原因是群中的節點參與入口路由網格。 這可以確保部署在群集中某個端口的服務始終將該端口保留給自己,而不管實際運行容器的節點是什么。 以下是三節點群上端口8080上發布的名為my-web的服務的路由網格示意圖:
迭代和擴展應用程序
從這里你可以完成你在第二部分和第三部分中學到的一切。
通過更改docker-compose.yml文件來擴展應用程序。
通過編輯代碼更改應用程序行為,然后重新構建并推送新鏡像。 (要做到這一點,請按照與之前構建應用程序和發布鏡像相同的步驟進行操作。
無論哪種情況,只需簡單地再次運行docker stack deploy來部署這些更改。
你可以使用你在myvm2上使用的相同docker swarm join命令將任何物理或虛擬機器加入此群集。之后只需運行Docker堆棧部署,并且你的應用可以利用新資源。
清除和重啟
Stacks and swarms(堆棧和集群)
你能通過docker stack rm卸載堆棧。例如:
docker?stack?rm?getstartedlab
取消設置docker-machine shell變量設置
你可以使用給定的命令取消當前shell中的docker-machine環境變量。在mac或者linux環境中命令如下:
eval?$(docker-machine?env?-u)
這將shell與docker-machine創建的虛擬機斷開連接,并允許您繼續在同一個shell中工作,現在使用本機docker命令(例如,在Docker for Mac或Docker for Windows上)。 要了解更多信息,請參閱關于取消設置環境變量的機器主題。
重啟Docker machines
如果不關閉你的本地主機,Docker machines將會停止運行。你能通過運行docker-machine ls命令來檢查機器的狀態。
$?docker-machine?ls
NAME????ACTIVE???DRIVER???????STATE?????URL???SWARM???DOCKER????ERRORS
myvm1???-????????virtualbox???Stopped?????????????????Unknown
myvm2???-????????virtualbox???Stopped?????????????????Unknown
要重新啟動已停止的計算機,請運行以下命令:
docker-machine?start?
例如:
$?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部分中,你了解了群體是什么,群體中的節點如何成為manager或workwer,創建群體并在其上部署應用程序。 你看到Docker的核心命令并沒有從第3部分改變,他們只需要將目標鎖定在swarm master上。 你還看到了Docker網絡的力量,即使它們運行在不同的機器上,也可以跨容器保持負載平衡請求。 最后,你學習了如何在集群上迭代和縮放應用程序。
以下是一些您可能想要運行的命令,以便與你的群集和虛擬機進行一點交互:
docker-machine?create?--driver?virtualbox?myvm1?#?Create?a?VM?(Mac,?Win7,?Linux)
docker-machine?create?-d?hyperv?--hyperv-virtual-switch?"myswitch"?myvm1?#?Win10
docker-machine?env?myvm1????????????????#?View?basic?information?about?your?node
docker-machine?ssh?myvm1?"docker?node?ls"?????????#?List?the?nodes?in?your?swarm
docker-machine?ssh?myvm1?"docker?node?inspect?
docker-machine?ssh?myvm1?"docker?swarm?join-token?-q?worker"???#?View?join?token
docker-machine?ssh?myvm1???#?Open?an?SSH?session?with?the?VM;?type?"exit"?to?end
docker?node?ls????????????????#?View?nodes?in?swarm?(while?logged?on?to?manager)
docker-machine?ssh?myvm2?"docker?swarm?leave"??#?Make?the?worker?leave?the?swarm
docker-machine?ssh?myvm1?"docker?swarm?leave?-f"?#?Make?master?leave,?kill?swarm
docker-machine?ls?#?list?VMs,?asterisk?shows?which?VM?this?shell?is?talking?to
docker-machine?start?myvm1????????????#?Start?a?VM?that?is?currently?not?running
docker-machine?env?myvm1??????#?show?environment?variables?and?command?for?myvm1
eval?$(docker-machine?env?myvm1)?????????#?Mac?command?to?connect?shell?to?myvm1
&?"C:\Program?Files\Docker\Docker\Resources\bin\docker-machine.exe"?env?myvm1?|?Invoke-Expression???#?Windows?command?to?connect?shell?to?myvm1
docker?stack?deploy?-c?
docker-machine?scp?docker-compose.yml?myvm1:~?#?Copy?file?to?node's?home?dir?(only?required?if?you?use?ssh?to?connect?to?manager?and?deploy?the?app)
docker-machine?ssh?myvm1?"docker?stack?deploy?-c?
eval?$(docker-machine?env?-u)?????#?Disconnect?shell?from?VMs,?use?native?docker
docker-machine?stop?$(docker-machine?ls?-q)???????????????#?Stop?all?running?VMs
docker-machine rm $(docker-machine ls -q) # Delete all VMs and their disk i
mages
關注
Docker
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。