假设当前我正在运行使用在主机端口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
到现在为止,一切正常。一切顺利,没有问题。
现在,
我想通过使用在主机端口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
。
答案 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