第4部分:群 | Part 4: Swarms
开始,第4部分:蜂群
- 1:概况介绍
- 2:集装箱
- 3:服务
- 4:成群
- 5:堆叠
- 6:部署应用程序
先决条件
- 安装Docker版本1.13或更高版本。
- 按照第3部分的先决条件中所述获取Docker撰写。
- 获取预装Docker for Mac和Docker for Windows的 Docker Machine,但在Linux系统上需要直接安装它。在
没有Hyper-V的
Windows 10系统之前以及Windows 10 Home中,使用Docker Toolbox。
- 阅读第1部分中的方向。
- 学习如何在第2部分中创建容器。
- 确保您已经发布了
friendlyhello
你创造的形象将其推送到注册表我们将在这里使用共享的图像。
- 确保你的图像作为一个部署的容器。运行此命令,在您的信息开槽
username
,repo
和tag
:docker 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驱动程序:
$ docker-machine create --driver virtualbox myvm1
$ docker-machine create --driver virtualbox myvm2
你现在有两个虚拟机创建,命名myvm1
和myvm2
(如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并指定port2377
(swarm连接的端口)--advertise-addr
。例如:docker-machine sshmyvm1
“docker swarm init
--advertise-addr
192.168.99.100:2377
”
如您所见,对docker swarm init
包含预先配置的docker swarm join
命令,以便在要添加的任何节点上运行。复制此命令,并将其发送到myvm2
通孔docker-machine ssh
有myvm2
加入你的新蜂群作为一个工人:
$ 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
在该群查看节点:
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"
本地机器上的虚拟机(Windows 10)
首先,快速创建一个虚拟交换机供您的VM共享,这样它们就能够相互连接。
- 发射超V管理器
- 点击
虚拟开关管理器
在右边的菜单中
- 点击
创建虚拟开关
类型外部
- 给它起个名字
myswitch
,并选中此复选框以共享主机的活动网络适配器
现在,使用我们的节点管理工具创建几台虚拟机,docker-machine
*
$ docker-machine create -d hyperv --hyperv-virtual-switch "myswitch" myvm1
$ docker-machine create -d hyperv --hyperv-virtual-switch "myswitch" myvm2
你现在有两个虚拟机创建,命名myvm1
和myvm2
(如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并指定port2377
(swarm连接的端口)--advertise-addr
。例如:docker-machine sshmyvm1
“docker swarm init
--advertise-addr
192.168.99.100:2377
”
如您所见,对docker swarm init
包含预先配置的docker swarm join
命令,以便在要添加的任何节点上运行。复制此命令,并将其发送到myvm2
通孔docker-machine ssh
有myvm2
加入你的新蜂群作为一个工人:
$ 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
在该群查看节点:
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"
在集群上部署应用程序
困难的部分结束了。现在,您只需重复您在其中使用的过程。第3部分部署到你的新蜂群上。记住,只有一群经理喜欢myvm1
执行Docker命令;工作人员只是为了容量。
使用以下命令docker-compose.yml
将第3部分中创建的文件复制到swarm管理器myvm1
的主目录(别名:):~docker-machine scp
docker-machine scp docker-compose.yml myvm1:~
现在有myvm1
使用它作为群管理器的功能,通过发送同样的命令来部署应用程序。docker stack deploy
在第3部分中使用的命令myvm1
使用docker-machine ssh
*
docker-machine ssh myvm1 "docker stack deploy -c docker-compose.yml getstartedlab"
就是这样,应用程序部署在一个集群上。
将第3部分中使用的所有命令打包到docker-machine ssh
它们都会像你所期望的那样工作。只是这一次,您将看到容器在两个myvm1
和myvm2
...
$ 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
例如:
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网络的强大功能,即使它们在不同的机器上运行,也能保持跨容器的负载平衡请求。最后,您学习了如何在集群上迭代和缩放应用程序。
下面是一些您可能希望运行的命令,以便与群集进行交互:
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
swarm,scale,cluster,machine,vm,manager,worker,deploy,ssh,orchestration