[英]No route to host within docker container
我在 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
似乎是容器存在连接问题,因此您提出的解决方案可能不起作用,因为这只是将主机端口映射到容器端口(考虑到您的目标 URL 不是实际主机)。
查看https://docs.docker.com/compose/compose-file/#network_mode并尝试将其设置为主机。
您的浏览器可以访问164.16.240.30:9000
,因为它通过代理(典型的企业环境),因此the proxy
具有到164.16.240.30
网络连接。 这并不意味着您的主机也具有相同的网络连接。 实际上,您的主机似乎没有那个。 这就是为什么从容器或终端直接 wget 出现错误No route to host
。
一切都必须通过代理。 尝试正确配置代理 - Linux 应用程序通常使用环境变量http_proxy,https_proxy
,但应用程序可能有自己的配置代理选项,最终您可以在源代码级别进行配置。 这取决于使用的应用程序/代码。
我认为问题在于您在 docker compose 配置文件中使用了主机模式,并且您是否为 debian 机器中的端口允许 IPTABLES 防火墙? 窗户呢?
network_mode: host
它实际上完全绕过了 docker 桥,因此不应用您指定的端口部分。 所有端口都将在主机系统上打开。 你可以检查
nestat -tunlp | grep 5000
并且您会看到端口 5000 未打开并映射到 docker 的 80,如您所料。 但是端口 80 和 9000 应该在 debian 网络上打开,但不绑定到任何 docker 网桥,只绑定到 debian ip。
从这里: https : //docs.docker.com/network/host/
警告:使用主机网络模式时,已发布的端口将被丢弃
解决方案可能是删除 network_mode 行,它会按预期工作。
您的代码不允许您的容器访问164.16.240.30:9000
。 您应该从终端 wget 164.16.240.30:9000
而不是172.17.240.30:9000
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.