Den*_*oef 5 docker docker-compose docker-networking
如何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
Run Code Online (Sandbox Code Playgroud)
我将以下内容添加到我计算机上的主机文件中
127.0.0.1 foobar
127.0.0.1 barfoo
Run Code Online (Sandbox Code Playgroud)
现在我用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
foobar
在内部 docker dns 中注册的服务名称只能由运行时创建的同一 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
Run Code Online (Sandbox Code Playgroud)
但随后foobar
需要使用连接localhost:8002
原因是我想模拟类似生产的情况,在生产中不需要端口,因为它们使用不同的主机名并且都可以直接使用端口 80
如果这确实是您想要的,更好的选择是使用 docker stack。
你的服务将是docker swarm服务:
您可以使用以下方式部署它们:
docker deploy --compose-file path_to_compose_file
然后将使用服务名称和端口foobar
连接barfoo
barfoo:80
归档时间: |
|
查看次数: |
5148 次 |
最近记录: |