介绍

在第三节中,选择了第二节中编写的应用程序,并通过将其转换为服务来定义它应如何在生产中运行,并生成五个应用实例

在本节中,将此应用程序部署到群集上,在多台计算机上运行它。多容器,多机应用程序通过连接多台机器到称为一个“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从零开始(四)集群初体验,docker-machine  swarm-LMLPHP

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从零开始(四)集群初体验,docker-machine  swarm-LMLPHP

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  swarm-LMLPHP

安装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

docker从零开始(四)集群初体验,docker-machine  swarm-LMLPHP

安装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=
gpgcheck=
repo_gpgcheck=
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

docker从零开始(四)集群初体验,docker-machine  swarm-LMLPHP

如果报下面的错:

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.

docker从零开始(四)集群初体验,docker-machine  swarm-LMLPHP

当其他节点需要加入以node1为领导者的群集的时候 需要携带 如上圈出来的token

join --token SWMTKN--0qssxg0zv4oll1pnhncwjn6k3donqnemfgxb4ez9o2wiutcyb2-birg7d8tnphhqkmc2dtphf0t6 192.168.99.100:

使用SSH时遇到问题?试试--native-ssh标志

Docker Machine 使用自己系统ssh,如果由于某种原因您在向Swarm管理器发送命令时遇到问题。只需--native-ssh在调用ssh命令时指定 标志:

docker从零开始(四)集群初体验,docker-machine  swarm-LMLPHP

如您所见,响应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在管理器上运行以查看此群中的节点:

docker从零开始(四)集群初体验,docker-machine  swarm-LMLPHP

在群集群集上部署您的应用程序

困难的部分结束了。现在,您只需重复第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=""
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从零开始(四)集群初体验,docker-machine  swarm-LMLPHP

运行docker-machine ls以验证它myvm1现在是活动计算机,如旁边的星号所示。

docker从零开始(四)集群初体验,docker-machine  swarm-LMLPHP

在群集管理器上部署应用程序

现在myvm1,您可以使用其作为群组管理器的功能,通过使用docker stack deploy您在myvm1中使用第3节中相同命令docker-compose.yml来部署你本地的应用程序.。此命令可能需要几秒钟才能完成,部署需要一些时间才能完成。

使用docker service ps <service_name>swarm管理器上的 命令验证是否已重新部署所有服务。

myvm1通过docker-machineshell配置连接到,并且仍然可以访问本地主机上的文件。确保您与以前位于同一目录中,其中包括docker-compose.yml文件在第三节中已经被创建

在myvm1中与以前一样,运行以下命令以部署应用程序

docker从零开始(四)集群初体验,docker-machine  swarm-LMLPHP

现在,您可以使用第3节使用的相同docker命令。只是这一次通知的服务(和相关容器)已经在两者之间分布myvm1myvm2

docker从零开始(四)集群初体验,docker-machine  swarm-LMLPHP

你可以从IP地址来访问你的应用程序要么 myvm1myvm2

您创建的网络在它们之间共享并进行负载平衡。运行 docker-machine ls以获取VM的IP地址,并在浏览器上访问其中任何一个,点击刷新(或只是curl它们)。

docker从零开始(四)集群初体验,docker-machine  swarm-LMLPHP

有五种可能的容器ID都是随机循环的,这表明了是在负载平衡的提供访问。

这个两个IP地址工作的原理是群中的节点参与入口路由网格。这可确保部署在swarm中无论运行哪个容器实例某个端口的服务始终将该端口保留给自身。

下面是一个图表,说明在三节点群上的my-web端口8080上发布的服务的路由网格如何显示:

docker从零开始(四)集群初体验,docker-machine  swarm-LMLPHP

请记住,要在群集中使用入口网络,您需要在启用群集模式之前在群集节点之间打开以下端口:

  • 端口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)

docker从零开始(四)集群初体验,docker-machine  swarm-LMLPHP

05-23 13:35