介紹
在第三節中,選擇了第二節中編寫的應用程序,並通過將其轉換為服務來定義它應如何在生產中運行,並生成五個應用實例
在本節中,將此應用程序部署到群集上,在多台計算機上運行它。多容器,多機應用程序通過連接多台機器到稱為一個“Dockerized” 容器的集群。
了解Swarm集群
swarm集群是指運行了。在此之后,您繼續運行您習慣使用的Docker命令,但現在它們由群集管理器在群集上執行。群中的機器可以是物理的或虛擬的。加入群組后,它們被稱為節點。
Swarm管理器可以使用多種策略來運行容器,例如“emptiest node” - 優先使用cpu利用率最低的容器。或“global”,它確保每台機器只獲得指定容器的一個實例。swarm管理器根據compose配置文件中定義策略來執行。
群集管理器是群中唯一可以執行命令的機器,或授權其他機器作為工作者加入群集。工作者只是在那里提供工作能力,並且沒有權力告訴任何其他機器它能做什么和不能做什么。
到目前為止,您一直在本地計算機上以單主機模式使用Docker。但是Docker也可以切換到swarm模式,這就是使用群集的能力。
立即啟用群集模式使當前計算機成為群集管理器。從那時起,Docker就會運行您在swarm manager上執行的命令,而不僅僅是在當前機器上。
設置你的群
群由多個節點組成,可以是物理或虛擬機。基本概念很簡單:運行docker swarm init以啟用swarm模式並使當前計算機成為群集管理器,然后docker swarm join在其他計算機上運行 以使它們作為工作者加入群組。
在創建集群前需要熟悉 和安裝 docker machine
什么是Docker Machine?
Docker Machine是一個工具,可讓您在虛擬主機上安裝Docker Engine,並使用docker-machine命令管理主機。您可以使用Machine在本地Mac或Windows機器上,公司網絡上,數據中心或Azure,AWS或Digital Ocean等雲提供商上創建Docker主機。
使用docker-machine命令,您可以啟動,檢查,停止和重新啟動托管主機,升級Docker客戶端和守護程序,並配置Docker客戶端以與主機通信。
將Machine CLI指向正在運行的托管主機,您可以 直接在該主機上運行docker命令。例如,運行docker-machine env default以指向被調用的主機default,按照屏幕上的說明完成 env設置,然后運行docker ps,docker run hello-world等等。
我為什么要用它?
Docker Machine使您可以在各種Linux上配置多個遠程Docker主機。
-
我想在遠程系統上配置Docker主機

Docker Engine在Linux系統上本機運行。如果你有一個Linux機器人作為主系統,並且想要運行docker命令,那么你需要做的就是下載並安裝Docker Engine。但是,如果您想要一種有效的方式在網絡,雲端甚至本地配置多個Docker主機,您需要Docker Machine。
無論您的主系統是Mac,Windows還是Linux,您都可以在其上安裝Docker Machine並使用docker-machine命令來配置和管理大量Docker主機。它會自動創建主機,在其上安裝Docker Engine,然后配置docker客戶端。每個托管主機(“ 機器 ”)是Docker主機和已配置客戶端的組合。
Docker Engine和Docker Machine有什么區別?
當人們說“Docker”時,他們通常指的是Docker Engine,由Docker守護程序組成的客戶端 - 服務器應用程序,指定用於與守護進程交互的接口的REST API,以及與守護進程通信的命令行界面(CLI)客戶端(通過REST API包裝器)。
docker engine接受docker來自CLI命令,例如docker run <image>,docker ps可以列出運行容器,docker image ls 列出鏡像,等等。

Docker Machine是一個用於配置和管理Dockerized主機(帶有Docker Engine的主機)的工具。通常,您在本地系統上安裝Docker Machine。Docker Machine有自己的命令行客戶端 docker-machine和Docker Engine客戶端docker。您可以使用Machine在一個或多個虛擬系統上安裝Docker Engine。這些虛擬系統可以是本地的(如使用Machine在Mac或Windows上的VirtualBox中安裝和運行Docker Engine時)或遠程(如使用Machine在雲提供商上配置Dockerized主機時)。這些Dockerized機器就是托管在 Docker Machine上的機器

安裝Docker machine
如果您在Linux上運行:
$ base=https://github.com/docker/machine/releases/download/v0.14.0 && curl -L $base/docker-machine-$(uname -s)-$(uname -m) >/tmp/docker-machine && sudo install /tmp/docker-machine /usr/local/bin/docker-machine

安裝bash完成腳本
Machine資源庫提供了幾個bash腳本,可添加以下功能:
- 命令完成
- 一個在shell提示符下顯示活動計算機的函數
- 一個函數包裝器,它添加一個
docker-machine use子命令來切換活動機器
確認版本並將腳本保存到/etc/bash_completion.d或 /usr/local/etc/bash_completion.d:
base=https://raw.githubusercontent.com/docker/machine/v0.14.0 for i in docker-machine-prompt.bash docker-machine-wrapper.bash docker-machine.bash do sudo wget "$base/contrib/completion/bash/${i}" -P /etc/bash_completion.d done
然后,您需要source /etc/bash_completion.d/docker-machine-prompt.bash在bash終端中運行,告訴您的設置,它可以找到docker-machine-prompt.bash您之前下載的文件 。
要啟用docker-machineshell提示,請添加 $(__docker_machine_ps1)到您的PS1設置中~/.bashrc。
PS1='[\u@\h \W$(__docker_machine_ps1)]\$ '
下載virtualbox驅動
配置yum源 vi /etc/yum.repos.d/virtualbox.repo
[virtualbox] name=virtualbox baseurl=http://download.virtualbox.org/virtualbox/rpm/el/$releasever/$basearch enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://www.virtualbox.org/download/oracle_vbox.asc
安裝virtualbox
yum install VirtualBox-5.2 -y
創建一個集群
本地計算機上的VM(MAC,LINUX,WINDOWS 7和8)
您需要一個可以創建虛擬機(VM)的虛擬機管理程序,因此請為您的計算機操作系統安裝Oracle VirtualBox。
現在,docker-machine使用VirtualBox驅動程序創建幾個VM :
docker-machine create --driver virtualbox myvm1
docker-machine create --driver virtualbox myvm2
如果報下面的錯:
Wrapper Docker Machine process exiting due to closed plugin server (read tcp 127.0.0.1:54344->127.0.0.1:43214: read: connection reset by peer)
Error creating machine: Error in driver during machine creation: read tcp 127.0.0.1:54344->127.0.0.1:43214: read: connection reset by peer
docker-machine create --driver virtualbox --engine-registry-mirror https://1rqn7spi.mirror.aliyuncs.com myvm1 docker-machine create --driver virtualbox --engine-registry-mirror https://1rqn7spi.mirror.aliyuncs.com myvm2
初始化SWARM並添加節點
第一台機器充當管理器,執行管理命令並驗證工作人員加入群,第二台是工作人員。
您可以使用命令向VM發送命令docker-machine ssh。指示myvm1 成為一個swarm管理器docker swarm init並查找如下輸出:
[root@docker11 ~]# docker-machine ssh myvm1 "docker swarm init --advertise-addr 192.168.99.100"
Swarm initialized: current node (j0y6zr0u841mpm8pmxc5ldt1d) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-0qssxg0zv4oll1pnhncwjn6k3donqnemfgxb4ez9o2wiutcyb2-birg7d8tnphhqkmc2dtphf0t6 192.168.99.100:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

當其他節點需要加入以node1為領導者的群集的時候 需要攜帶 如上圈出來的token
join --token SWMTKN-1-0qssxg0zv4oll1pnhncwjn6k3donqnemfgxb4ez9o2wiutcyb2-birg7d8tnphhqkmc2dtphf0t6 192.168.99.100:2377
使用SSH時遇到問題?試試--native-ssh標志
Docker Machine 使用自己系統ssh,如果由於某種原因您在向Swarm管理器發送命令時遇到問題。只需--native-ssh在調用ssh命令時指定 標志:

如您所見,響應docker swarm init包含一個預先配置的 docker swarm join命令,您可以在要添加的任何節點上運行該命令。復制此命令,並將其發送到myvm2via docker-machine ssh以myvm2 將新群組作為工作者加入:
[root@docker11 ~]# docker-machine ssh myvm2 "docker swarm join --token SWMTKN-1-0qssxg0zv4oll1pnhncwjn6k3donqnemfgxb4ez9o2wiutcyb2-birg7d8tnphhqkmc2dtphf0t6 192.168.99.100:2377" This node joined a swarm as a worker.
恭喜你,你已經創建了你的第一個群!
docker node ls在管理器上運行以查看此群中的節點:

在群集群集上部署您的應用程序
困難的部分結束了。現在,您只需重復第3節中使用的過程即可部署到新的swarm上。請記住,只有群體管理員myvm1執行Docker命令; worker只是為了work。
docker-machine為swarm管理器配置shell
到目前為止,您已經將Docker命令包裝在docker-machine ssh與VM通信中。另一種選擇是運行docker-machine env <machine>以獲取並運行一個命令,該命令將當前shell配置為與VM上的Docker守護程序通信。此方法適用於下一步,因為它允許您使用本地docker-compose.yml文件“遠程”部署應用程序,而無需將其復制到任何位置。
鍵入docker-machine env myvm1,然后復制粘貼並運行作為輸出的最后一行提供的命令,以配置要與之通信的shell(myvm1swarm管理器)。
[root@docker11 ~]# docker-machine env myvm1 export DOCKER_TLS_VERIFY="1" export DOCKER_HOST="tcp://192.168.99.100:2376" export DOCKER_CERT_PATH="/root/.docker/machine/machines/myvm1" export DOCKER_MACHINE_NAME="myvm1" # Run this command to configure your shell: # eval $(docker-machine env myvm1)

運行docker-machine ls以驗證它myvm1現在是活動計算機,如旁邊的星號所示。

在群集管理器上部署應用程序
現在myvm1,您可以使用其作為群組管理器的功能,通過使用docker stack deploy您在myvm1中使用第3節中相同命令docker-compose.yml來部署你本地的應用程序.。此命令可能需要幾秒鍾才能完成,部署需要一些時間才能完成。
使用docker service ps <service_name>swarm管理器上的 命令驗證是否已重新部署所有服務。
您myvm1通過docker-machineshell配置連接到,並且仍然可以訪問本地主機上的文件。確保您與以前位於同一目錄中,其中包括docker-compose.yml文件在第三節中已經被創建
在myvm1中與以前一樣,運行以下命令以部署應用程序。

現在,您可以使用第3節使用的相同docker命令。只是這一次通知的服務(和相關容器)已經在兩者之間分布myvm1和myvm2。

你可以從IP地址來訪問你的應用程序要么 myvm1或myvm2。
您創建的網絡在它們之間共享並進行負載平衡。運行 docker-machine ls以獲取VM的IP地址,並在瀏覽器上訪問其中任何一個,點擊刷新(或只是curl它們)。

有五種可能的容器ID都是隨機循環的,這表明了是在負載平衡的提供訪問。
這個兩個IP地址工作的原理是群中的節點參與入口路由網格。這可確保部署在swarm中無論運行哪個容器實例某個端口的服務始終將該端口保留給自身。
下面是一個圖表,說明在三節點群上的my-web端口8080上發布的服務的路由網格如何顯示:

請記住,要在群集中使用入口網絡,您需要在啟用群集模式之前在群集節點之間打開以下端口:
- 端口7946 TCP / UDP用於容器網絡發現。
- 端口4789 UDP用於容器入口網絡。
清理並重新啟動
堆棧和群
你可以拆掉堆棧docker stack rm。例如:
docker stack rm getstartedlab
取消設置docker-machine shell變量設置
您可以docker-machine使用給定命令在當前shell中取消設置環境變量。
在Mac或Linux上,命令是:
eval $(docker-machine env -u)


