docker Swarms 集群

安装 Docker Machine

下载地址:https://docs.docker.com/machine/install-machine/#installing-machine-directly

如果不能下载,直接进入github下载二进制包来放在/usr/local/bin目录中即可

了解集群

集群是运行Docker并加入集群的一组机器。之后,您继续运行您以前使用的Docker命令,但现在它们是由群组管理器在集群上执行的。集群中的机器可以是物理的或虚拟的。加入群组后,它们被称为节点

Swarm管理员可以使用几种策略来运行容器,例如“最简单的节点” – 这些容器填充了最少使用的机器。或“全局”,它确保每个机器只能获得指定容器的一个实例。您可以指示群组经理在撰写文件中使用这些策略,就像您已经使用的策略一样。

群体管理器是集群中唯一可以执行命令的机器,或授权其他机器作为工作人员加入集群。工作人员只是提供能力,没有权力告诉任何其他机器它可以做什么和不能做什么。

到目前为止,您已经在本地计算机上以单主机模式使用Docker。但是Docker也可以切换到集群,这就是使用集群。立即启用集群模式使当前的机器成为集群管理器。从那时起,Docker将运行您正在管理的集群上执行的命令,而不仅仅是在当前的机器上运行。

设置你的群

一个集群由多个节点组成,可以是物理机或虚拟机。基本概念很简单:运行docker swarm init以启用集群式,使您当前的机器成为集群管理器,然后docker swarm join在其他机器上运行 ,让他们以工作人员身份加入集群。选择下面的标签,看看它是如何在各种上下文中播放的。我们将使用虚拟机快速创建双机集群并将其转换成集群。

创建一个集群

首先,您需要一个可以创建虚拟机的管理程序,因此可以为您的机器的操作系统安装VirtualBox

注意:如果您安装的是具有Hyper-V的Windows系统,例如Windows 10,则不需要安装VirtualBox,您应该使用Hyper-V。通过单击上面的Hyper-V选项来查看Hyper-V系统的说明。

现在,docker-machine使用VirtualBox驱动程序创建几个虚拟机:

$ docker-machine create --driver virtualbox myvm1
$ docker-machine create --driver virtualbox myvm2

命令会自动下载boot2docker.iso镜像,如果被墙命令执行失败,则复制命令日志中的url自行去下载,我就是自行下载的。下载后放到任意目录,这里我放在了/data/boot2docker.iso这里。执行下边的命令创建虚拟机

docker-machine create --virtualbox-boot2docker-url file:///data/boot2docker.iso --driver virtualbox myvm1
docker-machine create --virtualbox-boot2docker-url file:///data/boot2docker.iso --driver virtualbox myvm2

您现在有两个虚拟机创建,命名myvm1myvm2(如docker-machine ls 显示)。第一个将作为经理,执行docker命令并认证工人加入群众,第二个将是一个工人。

您可以使用命令发送到您的虚拟机docker-machine ssh。指示myvm1 成为一个群组经理,docker swarm init你会看到这样的输出:

$ docker-machine ssh myvm1 "docker swarm init"
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> \
  <ip>:<port>

显示错误–advertise-addr?

复制myvm1运行的IP地址docker-machine ls,然后docker swarm init再次运行该 命令,使用该IP并指定端口2377 (与端口连接)–advertise-addr。例如:

docker-machine ssh myvm1 “docker swarm init –advertise-addr 192.168.99.100:2377”

无法连通创建的主机,可以执行下边的命令

sudo ifconfig vboxnet0 down && sudo ifconfig vboxnet0 up

删除vitualbox中的网络

您可以看到,响应docker swarm init包含一个预先配置的 docker swarm join命令,您可以在要添加的任何节点上运行。复制此命令,并将其发送到myvm2via docker-machine sshmyvm2 加入您的新群组作为工作人员:

$ docker-machine ssh myvm2 "docker swarm join \
--token <token> \
<ip>:<port>"

This node joined a swarm as a worker.

恭喜,你已经创建了你的第一个群。

注意:注意端口是2377!!!您也可以运行docker-machine ssh myvm2,不附加命令来打开该VM上的终端会话。键入exit当你准备返回到主shell提示符。以这种方式粘贴join命令可能会更容易。

使用ssh连接到(docker-machine ssh myvm1),并运行docker node ls在该群查看节点:

docker@myvm1:~$ docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS
brtu9urxwfd5j0zrmkubhpkbd     myvm2               Ready               Active              
rihwohkh3ph38fhillhhb84sk *   myvm1               Ready               Active              Leader

键入exit以退出该机器。

或者,包装命令docker-machine ssh不要直接登录和退出。例如:

docker-machine ssh myvm1 "docker node ls"

在集群上部署应用程序

困难的部分已经结束了。现在您只需重复上一篇文档中创建的docker-compose.yml进程,即可部署在新的集群中。只要记住,只有群管理者myvm1可以发送执行Docker命令; 工人只是为了执行。

使用以下命令将docker-compose.yml复制到集群管理器myvm1的主目录(别名:):~docker-machine scp

docker-machine scp docker-compose.yml myvm1:~

现在myvm1通过发送与docker stack deploy上篇文档中myvm1使用 的相同的命令来使用其作为群组管理器的权力来部署您的应用程序docker-machine ssh

docker-machine ssh myvm1 "docker stack deploy -c docker-compose.yml getstartedlab"

这就是应用程序部署在集群上。

将您在上一篇文档中使用的所有命令包含在调用中docker-machine ssh,并且它们将按照您的期望工作。在这个时候,你会看到容器已经在两者之间分布myvm1myvm2

$ docker-machine ssh myvm1 "docker stack ps getstartedlab"

ID            NAME        IMAGE              NODE   DESIRED STATE
jq2g3qp8nzwx  test_web.1  username/repo:tag  myvm1  Running
88wgshobzoxl  test_web.2  username/repo:tag  myvm2  Running
vbb1qbkb0o2z  test_web.3  username/repo:tag  myvm2  Running
ghii74p9budx  test_web.4  username/repo:tag  myvm1  Running
0prmarhavs87  test_web.5  username/repo:tag  myvm2  Running

访问您的群集

你可以从IP地址来访问你的应用程序要么 myvm1myvm2。您创建的网络在它们之间共享,并且负载平衡。运行 docker-machine ls以获取您的虚拟机的IP地址,并在浏览器上访问它们,然后点击刷新(或仅仅curl它们)。您会看到五个可能的容器ID,它们都随机循环,显示了负载平衡。

IP地址工作的原因是群集中的节点参与入口路由网格。这样可以确保在群集中某个端口部署的服务始终将该端口保留给其自身,无论实际运行的是哪个节点。以下是在三节点群集my-web端口8080上发布的服务的路由网格如何显示:

有连通性麻烦?

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

端口7946用于容器网络发现的TCP / UDP。
端口4789 UDP用于容器入口网络。

迭代和缩放您的应用程序

从这里你可以做所有你在docker 服务部分学到的东西。

通过更改docker-compose.yml文件来缩放应用程序。

通过编辑代码来更改应用程序行为。

在这两种情况下,只需docker stack deploy再次运行以部署这些更改。

您可以使用与docker swarm join您使用的相同的命令将任何物理机或虚拟机加入此集群myvm2,并将容量添加到集群中。docker stack deploy稍后运行,您的应用程序将利用新的资源。

清理

你可以移除堆叠docker stack rm。例如:

docker-machine ssh myvm1 "docker stack rm getstartedlab"

保持群体或去除它?

在稍后的某个时候,如果要docker-machine ssh myvm2 “docker swarm leave”在工作人员和docker-machine ssh myvm1 “docker swarm leave –force”管理员上使用,您可以删除此群组

在本部分中,您了解了一个群体,群组中的节点如何可以成为管理者或工作人员,创建了群集,并在其上部署了一个应用程序。你看到Docker的核心命令没有从docker服务部分改变,他们只需要在群集主机上运行。您还看到了Docker网络的强大功能,即使它们在不同的机器上运行,这些功能也可以在容器之间保持负载平衡请求。最后,您学习了如何在集群上迭代和扩展应用程序。

这里有一些您可能希望运行的命令与您的群集进行交互:

docker-machine create --driver virtualbox myvm1 # 创建虚拟机(Mac,Win7,Linux)
docker-machine create -d hyperv --hyperv-virtual-switch "myswitch" myvm1 # Win10
docker-machine env myvm1 # 查看有关您节点的基本信息
docker-machine ssh myvm1 "docker node ls" # 列出你的群组中的节点
docker-machine ssh myvm1 "docker node inspect <node ID>" # 检查节点
docker-machine ssh myvm1 "docker swarm join-token -q worker" # 检查node View连接标记
docker-machine ssh myvm1 # 与VM打开SSH会话; 键入“exit”结束
docker-machine ssh myvm2 "docker swarm leave" # 从集群中移除工人
docker-machine ssh myvm1 "docker swarm leave -f" # Make master leave, kill swarm
docker-machine start myvm1 # 启动当前未运行的虚拟机
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
docker-machine scp docker-compose.yml myvm1:~ # 将文件复制到节点的主目录
docker-machine ssh myvm1 "docker stack deploy -c <file> <app>" # 部署应用程序

发表评论

电子邮件地址不会被公开。 必填项已用*标注