在特定的端口和主机名中部署副本

时间:2019-04-09 11:39:39

标签: docker docker-compose docker-swarm

我需要在一个集群中部署一个docker容器。我想部署Docker容器的4个副本。我想设置每个容器运行的端口,我需要知道它们的主机名。

我要吃4个副本的午餐。

  • 副本1应该侦听端口3001和主机名slave1。
  • 副本2应该侦听端口3002和主机名slave2。
  • 副本3应该侦听端口3003和主机名slave3。
  • Replica 4应该侦听端口3004和主机名slave4。

每个副本都具有相同的Dockerfile(因为我要运行的进程相同)。在Dockerfile中,我使用标准命令公开了所有4个端口: 展览3001 3002 3003 3004

我尝试了这个docker-compose文件,我在其中使用了4个端口,并使用“ mode:replicated”进行部署

services:
  slave:
    image: "DOCKER_REPO_NAME"
    deploy:
      mode: replicated
      replicas: 4
      restart_policy: 
        condition: on-failure
    networks:
      - my_net
    ports:
      - "3001:3001"
      - "3002:3002"
      - "3003:3003"
      - "3004:3004"

networks:
  my_net:
    external: true 

但是它不能像我上面所述那样工作。

希望问题的描述有意义。请让我知道。

1 个答案:

答案 0 :(得分:0)

我认为您分别以其应有的方式误解了docker swarm模式。群集模式在容器/节点级别上不起作用,但它是更高的抽象级别之一,正在与服务一起使用。

服务由在给定数量的节点上运行的给定数量的容器实例组成。 Swarm将处理swarm中正在运行的容器实例的数量,并将处理服务的容器在哪些节点上运行(当然,您可以使用replicasconstraints之类的参数进行配置。) >

群体模式的一大好处是,您无需了解群体基础架构的任何知识。您不必在意哪个节点以及哪个容器在哪个节点上运行。

相反,您只是告诉swarm要联系什么服务,并且swarm模式将决定将请求分发到哪个节点的哪个容器。

因此,在您的示例中,如果您的服务在端口3001上运行,并且假设有一个名为GET /hello的api端点,您将请求http://slave:3001/hello。这就是群模式起作用的地方,因为它知道哪些容器在哪些节点上运行,它将决定将请求转发到何处。

如果要让特定的容器侦听特定节点上的特定端口,则必须定义多个服务并使用constraints and labels ..来配置这些服务,因此docker-compose.yml类似于:

services:
  slave1:
    image: "DOCKER_REPO_NAME"
    deploy:
      mode: replicated
      replicas: 1
      placement:
        constraints:
          - node.labels.type == slave1
      restart_policy: 
        condition: on-failure
    networks:
      - my_net
    ports:
      - "3001:3001"
  slave2:
    image: "DOCKER_REPO_NAME"
    deploy:
      mode: replicated
      replicas: 1
      placement:
        constraints:
          - node.labels.type == slave2
      restart_policy: 
        condition: on-failure
    networks:
      - my_net
    ports:
      - "3002:3001"
  slave3:
    image: "DOCKER_REPO_NAME"
    deploy:
      mode: replicated
      replicas: 1
      placement:
        constraints:
          - node.labels.type == slave3
      restart_policy: 
        condition: on-failure
    networks:
      - my_net
    ports:
      - "3003:3001"
  slave4:
    image: "DOCKER_REPO_NAME"
    deploy:
      mode: replicated
      replicas: 1
      placement:
        constraints:
          - node.labels.type == slave4
      restart_policy: 
        condition: on-failure
    networks:
      - my_net
    ports:
      - "3004:3001"

networks:
  my_net:
    external: true 

但是请注意,这正在破坏蜂群的许多好处。