我正在Windows 10计算机上运行Debian docker容器,该容器需要访问端口9000(164.16.240.30:9000
)上的特定URL
主机可以通过浏览器正常访问它,但是当我登录到终端并运行wget 172.17.240.30:9000
时,我会得到failed: No route to host
。
为了解决这个问题,我添加了:
ports:
- 9000:9000
到docker-compose.yml文件,但这似乎没有什么区别。
以防万一你猜不到我是新来的,那么接下来你会怎么做?
整个docker-compose.yml文件:
version: '3.4'
services:
tokengeneratorapi:
network_mode: host
image: ${DOCKER_REGISTRY}tokengeneratorapi
build:
context: .
dockerfile: TokenGeneratorApi/Dockerfile
ports:
- 5000:80
- 9000
environment:
ASPNETCORE_ENVIRONMENT: local
SSM_PATH: /ic/env1/tokengeneratorapi/
AWS_ACCESS_KEY_ID:
AWS_SECRET_ACCESS_KEY:
我正在运行的命令:
docker-compose build --build-arg BRANCH=featuretest --build-arg CHANGE_ID=99 --build-arg CHANGE_TARGET=develop --build-arg SONAR_SERVER=164.16.240.30
答案 0 :(得分:1)
似乎是容器存在连接问题,因此您建议的解决方案可能无法正常工作,因为这只是将主机端口映射到容器端口(考虑到目标URL不是实际的主机)。
检出https://docs.docker.com/compose/compose-file/#network_mode并尝试将其设置为主机。
答案 1 :(得分:1)
您的浏览器可以访问164.16.240.30:9000
,因为它正在通过代理(典型的企业环境),因此the proxy
具有到164.16.240.30
的网络连接。这并不意味着您的主机也具有相同的网络连接。实际上,您的主机似乎没有那个主机。这就是为什么来自容器或终端的直接wget出现错误No route to host
的原因。
一切都必须通过代理。尝试正确配置代理-linux应用通常使用环境变量http_proxy,https_proxy
,但是应用可能具有自己的选项来配置代理,最终您可以在源代码级别进行配置。这取决于使用的应用程序/代码。
答案 2 :(得分:1)
我认为问题在于您在docker compose配置文件中使用了主机模式,并且debian机器中的端口是否具有IPTABLES防火墙? Windows怎么样?
network_mode: host
实际上实际上完全绕过了docker bridge,因此您指定的端口部分未应用。所有端口将在主机系统上打开。您可以使用
查看nestat -tunlp | grep 5000
您将看到端口5000没有打开,并且未按预期映射到Docker的80。但是,端口80和9000应该在debian网络上打开,但不应仅绑定到Debian IP上的任何Docker桥。
从这里:https://docs.docker.com/network/host/
警告:使用主机网络模式时,已发布的端口将被丢弃
作为解决方案,可以删除network_mode行,它将按预期运行。
答案 3 :(得分:0)
您的代码不允许您的容器访问164.16.240.30:9000
。您应该从终端上获取164.16.240.30:9000
,而不是172.17.240.30:9000
。