docker 蜂拥而至。 运行 每个节点只提供一次服务

docker swarm . Run some service only once per node

我用的是docker版本

    Client:
 Version:           18.06.1-ce
 API version:       1.38
 Go version:        go1.10.3
 Git commit:        e68fc7a
 Built:             Tue Aug 21 17:24:51 2018
 OS/Arch:           linux/amd64
 Experimental:      false

Server:
 Engine:
  Version:          18.06.1-ce
  API version:      1.38 (minimum version 1.12)
  Go version:       go1.10.3
  Git commit:       e68fc7a
  Built:            Tue Aug 21 17:23:15 2018
  OS/Arch:          linux/amd64
  Experimental:     false

和 docker-compose 用于配置我的服务。我想在一些特别标记的 3 个节点上有 3 个 运行 服务器的副本。为此,我使用像 :

这样的 yaml 配置
version: '3.7'

services:
  ser:
    deploy:
      placement:
        constraints:
          - "node.labels.cloud.type == nodesforservice"
      replicas: 3
      restart_policy:
        condition: any
      rollback_config:
        delay: 0s
        parallelism: 0
      update_config:
        delay: 6s
        parallelism: 1
    environment:
      - affinity:service!=stackname_servicename
    image: service:latest

并通过

部署此配置
docker stack deploy --compose-file docker-stack.yml stackname

但我发现 affinity:service!=stackname_servicename 无法正常工作(或根本无法工作)。它仅适用于已弃用的独立模式。如果当前只有 2 个节点可用,则服务将被部署到某个节点两次。这是我试图避免的。

是否有可能 docker swarm 明确表示不允许使用同一服务的 2 个容器?我发现只能使用 --mode global 创建全局服务,但我只需要 3 个实例,而不是更多。

这是一个相当古老的话题,但是使用节点标签作为放置约束并结合全局模式部署可以解决问题。

deploy:
  mode: global
  placement:
    constraints:
      - node.labels.cloud.type == nodesforservice

当然需要将节点标签"cloud.type=nodesforservice"应用于所需数量的节点。

对于Docker swarm 没有亲和力这回事。

如果您正在使用 docker 创建服务,您可以使用 --replicas-max-per-node 1 强制容器和节点之间的 1:1 关系。

如果您使用的是撰写文件,您可以在以下位置声明 max_replicas_per_node:

deploy:
  placement:
    max_replicas_per_node: 1

如果您需要进一步控制哪个节点可以运行容器使用标签,请将标签匹配放置在约束块下。

此处有更多详细信息:Compose and Docker compatibility matrix