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

eth*_*ypt 2 port docker docker-swarm

我创建了一个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:
Run Code Online (Sandbox Code Playgroud)

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

> Error response from daemon: rpc error: code = 3 desc = port '8000' is already in use by service.
Run Code Online (Sandbox Code Playgroud)

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

端口:-“模式=主机,目标=8000,发布=8000”

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

> 1 error(s) decoding:

* Invalid containerPort: mode=host, target=8000, published=8000
Run Code Online (Sandbox Code Playgroud)

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

ps:我尝试了“Version3”和“Version3.2”,但问题没有解决。

San*_*Kim 5

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

顺便说一句,尝试使用可以在文件中指定的长语法host modedocker-compose.yml

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

是与语法版本兼容的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:
Run Code Online (Sandbox Code Playgroud)