不同节点上的Docker群集副本

不同节点上的Docker群集副本,docker,docker-compose,docker-swarm,Docker,Docker Compose,Docker Swarm,我正在使用docker compose file version 3及其部署密钥来运行swarm(docker version 1.13),我想复制一个服务,以使其能够再次恢复单节点故障 但是,当我添加这样的部署部分时: deploy: replicas: 2 在我的四节点集群中,有时两个副本都安排在同一节点上。我缺少的是在不同节点上调度这两个实例的约束 我知道我可以使用global模式,但这会在每个节点上运行一个实例,也就是说,在我的例子中,四个实例而不是两个 是否有一种简单的方法可

我正在使用docker compose file version 3及其部署密钥来运行swarm(docker version 1.13),我想复制一个服务,以使其能够再次恢复单节点故障

但是,当我添加这样的部署部分时:

deploy:
    replicas: 2
在我的四节点集群中,有时两个副本都安排在同一节点上。我缺少的是在不同节点上调度这两个实例的约束

我知道我可以使用
global
模式,但这会在每个节点上运行一个实例,也就是说,在我的例子中,四个实例而不是两个

是否有一种简单的方法可以以通用的方式指定此约束,而不必求助于
全局
和标签的组合来避免其他实例


编辑:再次尝试后,我发现这次要在不同节点上安排容器。我开始怀疑我是否有一个
'node.hostname==X'
约束

编辑2:在另一次服务更新之后-并且没有任何放置约束-服务将再次在同一节点上计划(如所示):


您使用的是什么版本的docker?根据1.13中的这篇文章,此类问题已得到纠正,请务必查看:

希望这能回答您的问题。

似乎已解决,并已于年发布

添加了新的交换机<代码>--每个节点的最大副本数切换到docker服务

如何验证 创建两个服务并指定
--每个节点的最大副本数
其中一个:

docker service create --detach=true --name web1 --replicas 2 nginx
docker service create --detach=true --name web2 --replicas 2 --replicas-max-per-node 1 nginx
请参见命令输出上的差异:

$ docker service ls
ID                  NAME                MODE                REPLICAS               IMAGE               PORTS
0inbv7q148nn        web1                replicated          2/2                    nginx:latest        
9kry59rk4ecr        web2                replicated          1/2 (max 1 per node)   nginx:latest

$ docker service ps --no-trunc web2
ID                          NAME                IMAGE                                                                                  NODE                DESIRED STATE       CURRENT STATE            ERROR                                                     PORTS
bf90bhy72o2ry2pj50xh24cfp   web2.1              nginx:latest@sha256:b543f6d0983fbc25b9874e22f4fe257a567111da96fd1d8f1b44315f1236398c   limint              Running             Running 34 seconds ago                                                             
xedop9dwtilok0r56w4g7h5jm   web2.2              nginx:latest@sha256:b543f6d0983fbc25b9874e22f4fe257a567111da96fd1d8f1b44315f1236398c                       Running             Pending 35 seconds ago   "no suitable node (max replicas per node limit exceed)"   
错误消息将是:

no suitable node (max replicas per node limit exceed)
例如:

创建最多包含2个副本的服务:

docker service create --replicas=2 --replicas-max-per-node=2 --name test nginx:alpine
docker service inspect --format '{{.Spec.TaskTemplate.Placement.MaxReplicas}}' test
2
更新服务(最大副本数应保持其价值)

将最大副本数更新为1:

docker service update --replicas-max-per-node=1 test
docker service inspect --format '{{.Spec.TaskTemplate.Placement.MaxReplicas}}' test
1
并重置为0:

docker service update --replicas-max-per-node=0 test
docker service inspect --format '{{.Spec.TaskTemplate.Placement.MaxReplicas}}' test
0
扩展answer,正如在您的示例中使用的是compose文件,而不是cli,您可以为每个节点添加
max\u replications\u:1
,如中所示

version: '3.8'
...
yourservice:
    deploy:
          replicas: 2
          placement:
            max_replicas_per_node: 1
组合架构版本
3.8
在这里很关键,因为下面的
3.8
不支持每个节点最多复制副本


这是在

中添加的,对不起,我应该提到–1.13是我正在使用的版本。感谢链接到该问题-看起来它仍然是开放的。与该问题相关的是一个建议添加虚拟主机端口的解决方案:我想这可能会奏效,但感觉有点“黑客”。再次尝试后,我发现这次要在不同节点上调度容器。我开始怀疑我是否有一个'node.hostname==X'约束。那可能不是问题!我正在使用Docker 18.03,但仍遇到此问题。我对那个特殊的服务没有任何位置限制。我可能会尝试虚拟主机端口攻击。
version: '3.8'
...
yourservice:
    deploy:
          replicas: 2
          placement:
            max_replicas_per_node: 1