BenjaminYang In solitude, where we are least alone

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)

 

 

posted @ 2018-08-19 15:16  benjamin杨  阅读(2042)  评论(0编辑  收藏  举报