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



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

我会吃 4 个副本。

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

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

我尝试了这个 docker-compose 文件,其中我使用 4 个端口并使用"模式:复制"进行部署

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 

但它不像我和上面描述的那样工作。

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

我认为您分别误解了docker swarm模式的工作方式。Swarm 模式不适用于容器/节点级别,但它的抽象级别更高 - 它正在使用服务。

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

群模式的一大好处是,你不需要知道任何关于群的基础设施。您不关心哪些节点以及哪个容器在哪个节点上运行。

相反,您只需告诉 swarm 您要联系什么服务,swarm 模式将决定它将向哪个节点上的哪个容器调度您的请求。

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

如果你想让特定的容器侦听特定节点上的特定端口,你必须定义多个服务并使用约束和标签配置它们......所以你的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 

但请注意,这正在破坏蜂群的大部分好处。

最新更新