我希望复制服务。
此服务以工作角色复制,在某些情况下,该服务在同一节点中复制两次,而不是每个节点复制一次。
我在docker-compose.yml中有
version: "3"
services:
api-test:
# replace username/repo:tag with your name and image details
image: some-image
deploy:
replicas: 2
placement:
constraints:
- node.role == worker
restart_policy:
condition: on-failure
ports:
- "4001:80"
networks:
- some-network
networks:
some-network:
答案 0 :(得分:1)
利用1.13(see this PR)中引入的HA调度策略,除非其他节点不可用于调度,否则在群集模式调度程序中将无法实现此行为。如果您定义了一个排除该节点的约束,或者定义了该节点上不可用的资源预留(CPU和内存),则该节点可能无法用于调度。我没有在您提供的撰写文件中看到任何一个。
一个潜在的问题是重启策略。这将在单个容器上定义一个重启策略,同时在停运后也可以采用群集模式重新部署容器。结果可能是正在运行的副本太多。因此,我建议从您的服务中删除restart_policy
部分,并让群体模式单独处理调度。
否则,我看到的一个节点上有多个容器的主要原因是重新启动集群中的节点。 Swarm模式将在仍在运行的节点(或重新启动的第一个节点)上重新安排服务,一旦其他节点重新连接,它将不会抢先停止正在运行的任务以将其安排在另一个节点上。您可以使用以下命令强制服务重新平衡:
docker service update --force $service_name
答案 1 :(得分:0)
这实际上是Docker Swarm的正常行为。您会看到Swarm根据许多条件(每个工作程序的负载,可用性等)选择节点来部署服务。
因此,如果您要确保在具有特定标签/角色(例如<form action ="{{ url_for('upload') }}" class= "dropzone" name="file" method = "POST" enctype = "multipart/form-data"></form>
的每个节点上复制服务,则应使用worker
模式而不是global
({{3 }}。
这样,您的撰写文件将如下所示:
replicas
这将在每个version: "3"
services:
api-test:
# replace username/repo:tag with your name and image details
image: some-image
deploy:
mode: global
placement:
constraints:
- node.role == worker
restart_policy:
condition: on-failure
ports:
- "4001:80"
networks:
- some-network
networks:
some-network:
节点上完全部署一次您的api-test
服务。