我需要在一个集群中部署一个docker容器。我想部署Docker容器的4个副本。我想设置每个容器运行的端口,我需要知道它们的主机名。
我要吃4个副本的午餐。
每个副本都具有相同的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
但是它不能像我上面所述那样工作。
希望问题的描述有意义。请让我知道。
答案 0 :(得分:0)
我认为您分别以其应有的方式误解了docker swarm模式。群集模式在容器/节点级别上不起作用,但它是更高的抽象级别之一,正在与服务一起使用。
服务由在给定数量的节点上运行的给定数量的容器实例组成。 Swarm将处理swarm中正在运行的容器实例的数量,并将处理服务的容器在哪些节点上运行(当然,您可以使用replicas
和constraints
之类的参数进行配置。) >
群体模式的一大好处是,您无需了解群体基础架构的任何知识。您不必在意哪个节点以及哪个容器在哪个节点上运行。
相反,您只是告诉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
但是请注意,这正在破坏蜂群的许多好处。