原文:https://blog.csdn.net/forezp/article/details/80186178node
在第3部分中,介紹了你在第2部分中編寫的應用程序,並定義了它應該如何在生產環境中運行,將其轉化爲服務,並在此過程當中將其擴展5倍實例。linux
在第4部分中,將此應用程序部署到羣集上,並在多臺機器上運行它。 經過將多臺機器鏈接到稱爲swarm的「Dockerized」羣集,使多容器,多機器應用成爲可能。web
Swarm是一組運行Docker並加入到集羣中的機器。加入到集羣中以後,你將繼續運行你習慣的Docker命令,但如今它如今在Docker Swarm的集羣上執行。集羣中的機器能夠是物理的也能夠是虛擬的。加入集羣后,單個容器被稱爲節點。docker
Swarm manager可使用多種策略來運行容器,例如「emptiest node」 - 它可使用容器填充使用率最低的機器。或者「global」,它確保每臺機器只獲取指定容器的一個實例。swarm managerd的這些策略須要在Compose文件中指定。shell
Swarm manager是羣體中惟一能夠執行你的命令的機器,或者受權其餘機器做爲worker加入到羣體中。workers只是在那裏提供能力,並無權力告訴任何其餘機器能夠作什麼和不能夠作什麼。瀏覽器
到目前爲止,您已經在本地機器上以單主機模式使用Docker。可是Docker也能夠切換到羣集模式,這就是使用羣集的緣由。當即啓用羣模式使當前的機器成爲羣管理器。今後,Docker將運行您在您管理的羣集上執行的命令,而不只僅是在當前機器上執行。bash
一個swarm是由多個節點組成,節點能夠是物理或者虛擬的機器。它的基本概念足夠簡單:運行docker swarm init 命令可以開啓swarm模式,而且使你的當前機器成爲swarm manager,運行docker swarm join命令可以讓其餘機器加入到 swarm 中成爲worker機器。選擇的下面的選項卡,看看它是如何各自狀況下發揮做用的。咱們使用虛擬機快速建立一個雙機集羣,而且將其變成swarm.網絡
你需須要一個能夠建立虛擬機(VM)的虛擬機管理程序,所以請爲你的計算機的操做系統安裝Oracle VirtualBox。session
如今,建立兩個vm使用docker-machine ,使用VirtualBox 驅動:app
docker-machine create --driver virtualbox myvm1
docker-machine create --driver virtualbox myvm2
複製代碼
你如今有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
複製代碼
第一個機器扮演的是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中去。請記住只有像myvm1這樣的羣集管理器才能執行Docker命令; worker只是用來工做的。
到目前爲止,你已經在Docker-machine ssh中將Docker命令包裝爲與虛擬機交談。 另外一種選擇是運行docker-machine env 來獲取並運行一個命令,該命令將當前shell配置爲與VM上的Docker守護進程進行通訊。 此方法對下一步更好,由於它容許您使用本地docker-compose.yml文件「遠程」部署應用程序,而無需將其複製到任何位置。
鍵入docker-machine env myvm1,而後複製粘貼並運行做爲輸出最後一行提供的命令,以將shell配置爲與swarm管理器myvm1對話。
配置shell的命令根據你是Mac,Linux仍是Windows而有所不一樣,所以下面的選項卡中顯示了每一個命令的示例。
運行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
複製代碼
如今你已經有了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堆棧部署,而且你的應用能夠利用新資源。
你能經過docker stack rm卸載堆棧。例如:
docker stack rm getstartedlab
複製代碼
你可使用給定的命令取消當前shell中的docker-machine環境變量。在mac或者linux環境中命令以下:
eval $(docker-machine env -u)
複製代碼
這將shell與docker-machine建立的虛擬機斷開鏈接,並容許您繼續在同一個shell中工做,如今使用本機docker命令(例如,在Docker for Mac或Docker for Windows上)。 要了解更多信息,請參閱關於取消設置環境變量的機器主題。
若是不關閉你的本地主機,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 Files\Docker\Docker\Resources\bin\docker-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
複製代碼
關注我: