docker - Docker撰写端口映射,主机端口!=容器端口
问题描述
如何curl http://barfoo:8002
在不更改 docker 文件的情况下从 foobar-container 工作?
我有以下撰写文件:
version: '3'
services:
foobar:
build:
context: ./foobar
ports:
- 8001:80
depends_on:
- barfoo
barfoo:
build:
context: ./barfoo
ports:
- 8002:80
我将以下内容添加到计算机上的主机文件中
127.0.0.1 foobar
127.0.0.1 barfoo
现在我开始这个项目docker-compose up
。
当我在终端上执行以下操作时,这在逻辑上可以正常工作:curl http://barfoo:8002
当我从 foobar 容器 ( docker-compose exec foobar /bin/bash
) 中的 Bash 执行相同操作时,我得到Failed to connect to barfoo port 8002: Connection refused
,如果我使用curl http://barfoo:80
它就可以了。
原因是我想模拟类似生产的情况,在生产中不需要端口,因为它们使用不同的主机名,并且都可以直接使用端口 80
解决方案
如何使 curl http://barfoo:8002从 foobar-container 工作,而不更改 docker 文件?
简单的解决方案是将主机端口 8002 映射到barfoo
端口 8002。但这可能不是您想要的。
barfoo
是在内部 docker dns 中注册的服务名称,只能由foobar
运行时创建的同一 docker 网络中的服务()访问docker-compose up
8002 是映射到 docker 主机的端口。
因此,当您curl http://barfoo:8002
从foobar
容器运行时,您会尝试将服务连接barfoo
到端口 8002。但是barfoo
在容器内的端口 80 上侦听,而不是在 8002 上。
另一种解决方案:
您可以添加network_mode: host
到barfoo
和foobar
。
foobar:
build:
context: ./foobar
network_mode: host
ports:
- 8001:80
depends_on:
- barfoo
barfoo:
build:
context: ./barfoo
network_mode: host
ports:
- 8002:80
但随后foobar
需要使用localhost:8002
原因是我想模拟类似生产的情况,在生产中不需要端口,因为它们使用不同的主机名,并且都可以直接使用端口 80
如果这真的是你想要的,一个更好的选择是使用 docker stack。
您的服务将是docker swarm服务:
您可以使用以下方式部署它们:
docker deploy --compose-file path_to_compose_file
然后foobar
将连接到barfoo
使用服务名称和端口barfoo:80
推荐阅读
- firebase - 禁用动态链接的手动构建 url
- .htaccess - htaccess,如果子域不是“dev”,请按照以下说明操作
- javascript - 像在 vscode 文件中一样搜索的 javascript 函数
- electron - 电子根本不会启动
- json - Flutter:如何根据声明为 JSON 显示的数据着色
- vba - SAP 进程会话 txt 不接受输入列
- c - 如何在linux上的c中在父进程和子进程之间进行ping-pong
- c++ - atomic_ref 当外部底层类型大小不是 2 的幂时
- python - 将输入变量分配给python字典
- ajax - Apache Wicket 文本字段 onUpdate