原文:https://blog.csdn.net/forezp/article/details/80186178
第四篇: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 <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.
複製程式碼
如您所見,對docker swarm init的響應包含一個預配置的docker swarm join命令,您可以在要新增的任何節點上執行該命令。 複製這個命令,並通過docker-machine ssh將它傳送到myvm2,讓myvm2作為一個worker加入你的新群體:
$ docker-machine ssh myvm2 "docker swarm join
--token <token>
<ip>:2377"
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 <service_name>命令驗證所有服務是否已被重新部署。
你通過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 <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部分中,你瞭解了群體是什麼,群體中的節點如何成為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 <node ID>" # Inspect a node
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 FilesDockerDockerResourcesindocker-machine.exe" env myvm1 | Invoke-Expression # Windows command to connect shell to myvm1
docker stack deploy -c <file> <app> # Deploy an app; command shell must be set to talk to manager (myvm1), uses local Compose file
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 <file> <app>" # Deploy an app using ssh (you must have first copied the Compose file to myvm1)
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 images
複製程式碼
關注我: