docker從零開始(四)集群初體驗,docker-machine swarm


介紹

在第三節中,選擇了第二節中編寫的應用程序,並通過將其轉換為服務來定義它應如何在生產中運行,並生成五個應用實例

在本節中,將此應用程序部署到群集上,在多台計算機上運行它。多容器,多機應用程序通過連接多台機器到稱為一個“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 psdocker run hello-world等等。

我為什么要用它?

Docker Machine使您可以在各種Linux上配置多個遠程Docker主機。

  • 我想在遠程系統上配置Docker主機

Docker Machine用於配置多個系統

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機器

安裝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 sshmyvm2 將新群組作為工作者加入:

 

[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命令只是這一次通知的服務(和相關容器)已經在兩者之間分布myvm1myvm2

 

你可以從IP地址來訪問你的應用程序要么 myvm1myvm2

您創建的網絡在它們之間共享並進行負載平衡。運行 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)

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM