如何通过在不同的主机端口上运行相同的docker-compose文件来创建具有相同映像的多个容器?

时间:2020-05-07 00:05:56

标签: docker docker-compose

假设当前我正在运行使用在主机端口Container A和Docker端口Image X上运行的映像3031创建的docker容器3030

DOCKER_COMPOSE.yaml

version: "3"
services:
  app:
    image: ${IMAGENAME}
    container_name: ${PROJECTNAME}_ContainerA
    restart: ${RESTART}
    build:
      context: ${BUILD}
      args:
        PORT: 3030       --> this goes to dockerfile
    ports:
      - "3031:3030"
    networks:
      salesdb_network:
        ipv4_address: ${IP}
    environment:
      - APP_PORT=3030

networks:
  some_network:
    external: true

我正在从环境文件中获取端口。以上仅用于演示

我跑了docker-compose --env-file **some_file** -f docker-compose.yaml up

enter image description here

到现在为止,一切正常。一切顺利,没有问题。

现在, 我想通过使用在主机端口Container B和Docker端口Image X上运行的映像3033创建另一个容器3032。对于端口已更改的docker_compose.yaml文件,我具有与上述相同的结构

我跑了docker-compose --env-file **some_file_2** -f docker-compose.yaml up

但是,我收到以下错误消息。

creating ${PROJECTNAME}_ContainerA... error

ERROR: for ${PROJECTNAME}_ContainerA  Cannot start service app: Address already in use

ERROR: for app  Cannot start service app: Address already in use
ERROR: Encountered errors while bringing up the project.

在我添加PROJECTNAME之前(我跟随着this),在运行Container B时,它曾经覆盖Container A AND端口将更改为3031/tcp, 0.0.0.0:3033->3032/tcp

1 个答案:

答案 0 :(得分:1)

我不会费心更改Dockerfile中的端口,让该应用在每个容器内的同一端口上侦听。每个容器都有一个单独的网络名称空间,因此它们不会冲突。您需要更改的是主机上已发布的端口。更改此:

ports:
  - "3031:3030"

使用类似这样的变量:

ports:
  - "${PORT}:3030"

然后在运行$PORT之前,在.env或外壳程序中定义docker-compose up环境变量。


我还建议删除以下内容:

    ipv4_address: ${IP}

相反,让docker在该网络上配置IP,然后使用DNS在容器之间找到您的容器。由于所有内容都是相同的服务名称,因此您可以使用容器名称${PROJECTNAME}_ContainerA,或为容器指定唯一的网络别名:

networks:
  salesdb_network:
    aliases:
    - ${PROJECTNAME}-app