在多个故障域中部署Docker Swarm模式服务

我是docker群模式的新手(我特别在谈论dockerv1.12中的群模式,我不是指较老的非集成docker群)。

我试图评估它是否适合为一个新的软件项目build立一个大型分布式容器化平台(我正在比较类似的技术,如mesosphere,kubernetes等)。

我对旧的非集成泊坞窗群(非群集模式)的理解是,您可以通过使用filter将节点的目标定位到多个故障域。 在Docker Swarm模式中是否有相同的方法?

例如在一个testing环境中,我有6个虚拟机 – 所有正在运行的docker。

我启动虚拟机1和2,并调用我的失败域1
我启动虚拟机3和4,并调用我的失败域2
我启动了VM 5和6,并调用我的失败域3

所有失败域由一个swarm manager和一个swarm worker组成。 实际上,每个域都有2个节点可以容纳服务容器。

我告诉docker创build一个新服务,并根据包含简单Web服务的映像运行3个容器。 Docker做的是事情,并旋转了3个容器,我的服务正在运行; 我可以访问我的负载平衡的Web服务没有任何问题。 欢呼!

但是,我想具体告诉docker将我的3个容器分布在域1,域2和域3上。

我怎样才能做到这一点? (另外 – 我是否在正确的网站上发布 – 是否应该在其他stackexchange站点之一?)

您可以像以前一样继续使用引擎标签。 或者使用新的群体,您可以在群体节点上定义节点标签。 然后,使用新的docker swarm,您可以为您的服务定义一个约束,并创build3个独立的服务,每个服务都被限制在您的某个故障域中运行。

对于节点标签,您可以使用docker node update --label-add az=1 vm1 ,这会将标签az1添加到您的vm1节点。 为您的其他AZ(可用区域是我倾向于使用的术语)和VM的重复此过程。

现在,当安排你的工作,你添加一个约束

 docker service create --constraint node.labels.az==1 \ --name AppAZ1 yourimage 

对于节点标签或引擎标签:

 docker service create --constraint engine.labels.az==1 \ --name AppAZ1 yourimage 

为你的每一个AZ重复这个。

不幸的是,我想不出一种方法来强制在每个AZ的自动传播中使用类似于--replicas 3东西,其中包括故障转移到每个虚拟机群集中的第二个节点。 但是,如果您为每个任务select一个单个VM,则可以将每个任务标记为相同的标签(例如--label-add vm=a ,然后执行--mode global --constraint node.label.vm==a在每个A节点上运行一项服务。