首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

第4部分:群 | Part 4: Swarms

  • 1:概况介绍
  • 2:集装箱
  • 3:服务
  • 4:成群
  • 5:堆叠
  • 6:部署应用程序

先决条件

  • 安装Docker版本1.13或更高版本。
  • 按照第3部分的先决条件中所述获取Docker撰写。
  • 阅读第1部分中的方向。
  • 学习如何在第2部分中创建容器。
  • 确保您已经发布了friendlyhello你创造的形象将其推送到注册表我们将在这里使用共享的图像。
  • 确保你的图像作为一个部署的容器。运行此命令,在您的信息开槽usernamerepotagdocker run -p 80:80 username/repo:tag,然后访问http://localhost/
  • 有一份你的docker-compose.yml从第3部分手巧。

导言

在第3部分,你拿了一个你在里面写的应用程序第二部分,并定义了如何在生产中运行,将其转化为服务,在流程中将其扩展到5倍。

在第4部分中,您将这个应用程序部署到一个集群上,在多台机器上运行它。多容器、多机器应用程序通过将多台机器连接到一个名为蜂群...

理解群集

Swarm是一组运行Docker并加入到集群中的机器。发生这种情况后,您将继续运行您习惯的Docker命令,但现在它们将由群集管理器在群集上执行。群体中的机器可以是物理的或虚拟的。加入群体后,他们被称为节点

群管理器可以使用几种策略来运行容器,比如“最空的节点”--即用容器填充利用率最低的机器。或“全局”,它确保每台机器都得到指定容器的一个实例。您指示群管理器在撰写文件中使用这些策略,就像您已经使用过的策略一样。

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

到目前为止,您一直在本地计算机上以单一主机模式使用Docker。但是码头工人也可以群模式,这就是为什么可以使用蜂群。启用群集模式立即使当前机器成为群管理器。从那时起,Docker将在您正在管理的群集上运行命令,而不仅仅是在当前的机器上运行。

建立你的蜂群

群集由多个节点组成,可以是物理的,也可以是虚拟机。基本概念非常简单:运行docker swarm init若要启用群集模式并使当前机器成为群集管理器,请运行docker swarm join在其他机器上,让它们作为工人加入蜂群。在下面选择一个选项卡,看看这在不同的上下文中是如何进行的。我们将使用VM快速创建一个双机集群,并将其转化为一个集群。

创建集群

  • 本地VM(Mac,Linux,Windows 7和8)
  • 本地虚拟机(Windows 10 / Hyper-V)

本地计算机上的虚拟机(Mac,Linux,Windows 7和8)

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

:如果您在安装了Hyper-V的Windows系统上,如Windows 10,则不需要安装VirtualBox,而应该使用Hyper-V。通过单击上面的Hyper-V选项卡查看超级V系统的说明。

现在,使用docker-machine,使用VirtualBox驱动程序:

代码语言:javascript
复制
$ docker-machine create --driver virtualbox myvm1
$ docker-machine create --driver virtualbox myvm2

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

您可以使用docker-machine ssh.指示myvm1成为一名群经理docker swarm init你会看到这样的输出:

代码语言:javascript
复制
$ 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-addrmyvm1通过运行复制IP地址docker-machine ls,然后docker swarm init再次运行该命令,使用该IP并指定port 2377(swarm连接的端口)--advertise-addr。例如:docker-machine ssh myvm1“docker swarm init --advertise-addr 192.168.99.100:2377”

如您所见,对docker swarm init包含预先配置的docker swarm join命令,以便在要添加的任何节点上运行。复制此命令,并将其发送到myvm2通孔docker-machine sshmyvm2加入你的新蜂群作为一个工人:

代码语言:javascript
复制
$ docker-machine ssh myvm2 "docker swarm join \
--token <token> \
<ip>:<port>"

This node joined a swarm as a worker.

恭喜你,你创造了你的第一群。

::您也可以运行docker-machine ssh myvm2没有附加任何命令来打开该VM上的终端会话。类型exit当您准备返回到主机shell提示符时。以这种方式粘贴Join命令可能更容易。

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

代码语言:javascript
复制
docker@myvm1:~$ docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS
brtu9urxwfd5j0zrmkubhpkbd     myvm2               Ready               Active              
rihwohkh3ph38fhillhhb84sk *   myvm1               Ready               Active              Leader

类型exit从机器里出来。

或者,将命令包装在docker-machine ssh以避免直接登录或退出。例如:

代码语言:javascript
复制
docker-machine ssh myvm1 "docker node ls"

本地机器上的虚拟机(Windows 10)

首先,快速创建一个虚拟交换机供您的VM共享,这样它们就能够相互连接。

  1. 发射超V管理器
  1. 点击虚拟开关管理器在右边的菜单中
  1. 点击创建虚拟开关类型外部
  1. 给它起个名字myswitch,并选中此复选框以共享主机的活动网络适配器

现在,使用我们的节点管理工具创建几台虚拟机,docker-machine*

代码语言:javascript
复制
$ docker-machine create -d hyperv --hyperv-virtual-switch "myswitch" myvm1
$ docker-machine create -d hyperv --hyperv-virtual-switch "myswitch" myvm2

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

您可以使用docker-machine ssh.指示myvm1成为一名群经理docker swarm init你会看到这样的输出:

代码语言:javascript
复制
$ 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-addrmyvm1通过运行复制IP地址docker-machine ls,然后docker swarm init再次运行该命令,使用该IP并指定port 2377(swarm连接的端口)--advertise-addr。例如:docker-machine ssh myvm1“docker swarm init --advertise-addr 192.168.99.100:2377”

如您所见,对docker swarm init包含预先配置的docker swarm join命令,以便在要添加的任何节点上运行。复制此命令,并将其发送到myvm2通孔docker-machine sshmyvm2加入你的新蜂群作为一个工人:

代码语言:javascript
复制
$ docker-machine ssh myvm2 "docker swarm join \
--token <token> \
<ip>:<port>"

This node joined a swarm as a worker.

恭喜你,你创造了你的第一群。

::您也可以运行docker-machine ssh myvm2没有附加任何命令来打开该VM上的终端会话。类型exit当您准备返回到主机shell提示符时。以这种方式粘贴Join命令可能更容易。

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

代码语言:javascript
复制
docker@myvm1:~$ docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS
brtu9urxwfd5j0zrmkubhpkbd     myvm2               Ready               Active              
rihwohkh3ph38fhillhhb84sk *   myvm1               Ready               Active              Leader

类型exit从机器里出来。

或者,将命令包装在docker-machine ssh以避免直接登录或退出。例如:

代码语言:javascript
复制
docker-machine ssh myvm1 "docker node ls"

在集群上部署应用程序

困难的部分结束了。现在,您只需重复您在其中使用的过程。第3部分部署到你的新蜂群上。记住,只有一群经理喜欢myvm1执行Docker命令;工作人员只是为了容量。

使用以下命令docker-compose.yml将第3部分中创建的文件复制到swarm管理器myvm1的主目录(别名:):~docker-machine scp

代码语言:javascript
复制
docker-machine scp docker-compose.yml myvm1:~

现在有myvm1使用它作为群管理器的功能,通过发送同样的命令来部署应用程序。docker stack deploy在第3部分中使用的命令myvm1使用docker-machine ssh*

代码语言:javascript
复制
docker-machine ssh myvm1 "docker stack deploy -c docker-compose.yml getstartedlab"

就是这样,应用程序部署在一个集群上。

将第3部分中使用的所有命令打包到docker-machine ssh它们都会像你所期望的那样工作。只是这一次,您将看到容器在两个myvm1myvm2...

代码语言:javascript
复制
$ 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

访问群集

您可以从任一 myvm1两个的IP地址访问您的应用程序myvm2。您创建的网络在它们之间共享并负载平衡。运行docker-machine ls以获取虚拟机的IP地址,然后在浏览器中访问其中的任意一个,并刷新(或者只是curl它们)。您将看到五个可能的容器ID,它们都是随机循环的,展示了负载平衡。

两个ip地址工作的原因是群集中的节点参与了入口。路由网格这可以确保部署在集群中某个端口的服务始终保留在自己的端口上,而不管实际运行的是哪个节点。下面是一个服务的路由网格是如何被称为my-web在港口发表8080在一个三节点群中,可以看到:

二次

二次

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

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

迭代和缩放应用程序

从这里开始,您可以完成在第3部分中了解到的所有内容。

通过更改docker-compose.yml档案。

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

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

您可以使用相同的方法将任何机器,无论是物理机器还是虚拟机器,加入到这个群集中。docker swarm join你用的命令myvm2,则将将容量添加到群集中。快跑docker stack deploy之后,你的应用程序将利用新的资源。

清理

你可以用docker stack rm例如:

代码语言:javascript
复制
docker-machine ssh myvm1 "docker stack rm getstartedlab"

保持群或删除它?在某个时候,如果你想要docker-machine ssh myvm2 "docker swarm leave"在工人和docker-machine ssh myvm1 "docker swarm leave --force"经理身上工作,你可以删除这个群体,但是你需要这个群体的第5部分,所以请保留它

关于第5部分

简述和备忘单(可选)

在第4部分中,您了解了群集是什么,集群中的节点如何成为管理人员或工作人员,如何创建群集,并在其上部署应用程序。您看到核心Docker命令与第3部分并没有改变,它们只是为了在群主上运行而成为目标。您还看到了Docker网络的强大功能,即使它们在不同的机器上运行,也能保持跨容器的负载平衡请求。最后,您学习了如何在集群上迭代和缩放应用程序。

下面是一些您可能希望运行的命令,以便与群集进行交互:

代码语言:javascript
复制
docker-machine create --driver virtualbox myvm1 # Create a VM (Mac, Win7, Linux)
docker-machine create -d hyperv --hyperv-virtual-switch "myswitch" myvm1 # Win10
docker-machine env myvm1                # View basic information about your node
docker-machine ssh myvm1 "docker node ls"         # List the nodes in your swarm
docker-machine ssh myvm1 "docker node inspect <node ID>"        # Inspect a node
docker-machine ssh myvm1 "docker swarm join-token -q worker"   # View join token
docker-machine ssh myvm1   # Open an SSH session with the VM; type "exit" to end
docker-machine ssh myvm2 "docker swarm leave"  # Make the worker leave the swarm
docker-machine ssh myvm1 "docker swarm leave -f" # Make master leave, kill swarm
docker-machine start myvm1            # Start a VM that is currently not running
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:~     # Copy file to node's home dir
docker-machine ssh myvm1 "docker stack deploy -c <file> <app>"   # Deploy an app

扫码关注腾讯云开发者

领取腾讯云代金券