docker swarm:如何只在运行任务的特定节点上发布服务

docker swarm: how to publish a service only on a specific node that runs a task

我创建了一个 docker-compose.yml 文件,其中包含在两个不同节点上 运行 的两个服务。这两个服务旨在在与客户端和服务器相同的端口上进行通信。下面是我的 docker-compose.yml 文件。

 version: "3"
services:
  service1:
    image: localrepo/image1
    deploy:
      placement:
        constraints: [node.hostname == node1]
      replicas: 1
      resources:
        limits:
          cpus: "1"
          memory: 1000M
      restart_policy:
        condition: on-failure
    ports:
      - 8000:8000
    networks:
      - webnet

  service2:
    image: localrepo/image2
    deploy:
      placement:
        constraints: [node.hostname == node2]
      replicas: 1
      resources:
        limits:
          cpus: "1"
          memory: 500M
      restart_policy:
        condition: on-failure
    ports:
      - "8000:8000"
    networks:
      - webnet
networks:
  webnet:

当我发出 docker stack deploy -c 时出现错误,读取

> Error response from daemon: rpc error: code = 3 desc = port '8000' is already in use by service.

在这个 thread 中,我读到在群中部署服务可以使群中的任何节点都可以访问该端口。如果我理解正确的话,这使得该端口被集群中的任何节点占用。在同一个线程中,建议使用 mode=host 发布,这只会暴露容器 运行 所在的实际主机上的端口。我在端口中将其应用为:

端口: - "mode=host, target=8000, published=8000"

在服务中进行更改并尝试发出 docker 堆栈会产生另一个错误:

> 1 error(s) decoding:

* Invalid containerPort: mode=host, target=8000, published=8000

有谁知道如何解决这个问题?

p.s: "Version3" 和 "Version3.2" 我都试过了,但问题没有解决。

我不知道你是如何指定 host mode 的,因为你的 docker-compose.yml 并不代表 host mode 任何地方。

顺便说一下,尝试使用 long syntax 可以在 docker-compose.yml 文件中指定 host mode

这个长语法是 v3.2 中的新语法,下面是示例(我检查它有效)

This 兼容 docker engine 版本与 docker-compose 语法版本。)

version: '3.4'     # version: '3.2' also will works

networks:
    swarm_network:
        driver: overlay


services:
    service1:
        image: asleea/test

        command: ["nc", "-vlkp", "8000"]

        deploy:
            mode: replicated
            replicas: 1
            placement:
                constraints:
                    - node.hostname == node1

        ports:
            - published: 8000
              target: 8000
              mode: host

        networks:
            swarm_network:

    service2:
        image: asleea/test

        command: ["nc", "service1", "8000"]

        deploy:
            mode: replicated
            replicas: 1
            placement:
                constraints:
                    - node.hostname == node2

        ports:
            - published: 8000
              target: 8000
              mode: host

        networks:
            swarm_network:

升级到最新的docker版本后问题已解决,18.01.0-ce