Docker 容器中无法访问主机

8

我正在Windows 10机器上运行Debian docker容器,需要访问端口9000上的特定URL(164.16.240.30:9000)。

主机可以通过浏览器正常访问它,但是当我登录终端并运行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

尝试通过wget模拟浏览器,如https://dev59.com/RVgQ5IYBdhLWcg3wLg45。可能是防火墙切断了连接。如果已安装并启用,请尝试禁用ufw(https://wiki.debian.org/Uncomplicated%20Firewall%20%28ufw%29):“sudo service ufw stop”。 - Jannes Botis
1
您的容器需要访问 164.16.240.30:9000,但该资源未在您的计算机上运行。您的浏览器可以访问此 164.16.240.30:9000 资源,但容器无法访问。我说得对吗?为什么您要尝试从终端获取不同的资源 172.17.240.30:9000 而不是 164.16.240.30:9000 呢? - Jan Garaj
请检查您的~/.wgetrc文件中是否有任何代理条目。 - Gautam
据我所知,tokengeneratorapi代理请求到某个sonar_server。这是正确的吗?我们是否确定tokengeneratorapi正确地转发到端口9000?下一步可能是登录到您的容器,并使用get或curl目标sonar服务器:9000。如果没问题,就将目标定向到您的tokengeneratorapi“应用程序”,例如127.0.0.1:9000,并确保它正确地转发(仍然在容器内)。 - grodzi
你的问题还不太清楚,你是说从容器中无法访问164.16.240.30:9000吗? 当你说“我登录终端并运行”时,你是在容器内部吗? 为什么你要使用不同的IP 172.17.240.30和164.16.240.30? - Vikrant Pawar
你能进入你的容器并执行一个 wget 到 localhost:9000 吗?也许这是容器本身的错误! - JRichardsz
4个回答

1
似乎容器存在连接问题,因此您提出的解决方案可能不起作用,因为它只是将主机端口映射到容器端口(考虑到您的目标URL不是实际主机)。请查看https://docs.docker.com/compose/compose-file/#network_mode并尝试将其设置为主机模式。

尝试过这个但无效,请查看更新后的问题。 - m.edmondson
此外,看起来“host”在非Linux主机上不起作用 https://docs.docker.com/network/network-tutorial-host/ - m.edmondson
你是否在公司代理后面?尝试使用 docker network prune。另外,基于什么镜像? - agermain
将主机使用的相同DNS设置为https://docs.docker.com/compose/compose-file/#/dns可能是值得的。当使用Docker for Windows时,最终你使用的是VM作为实际的主机,因此需要确保VM具有适当的DNS解析(如果有任何更改,则之后重新启动容器)。 - agermain
请显示主机上的所有监听端口。参见:https://dev59.com/nXVD5IYBdhLWcg3wOo5h#48199 - ofirule
显示剩余4条评论

1
您的浏览器可以访问164.16.240.30:9000,因为它通过代理(典型的企业环境)进行连接,所以代理服务器164.16.240.30具有网络连通性。这并不意味着您的主机也具有相同的网络连通性。实际上,看起来您的主机没有这个连通性。这就是为什么从容器或终端直接使用wget会出现错误No route to host的原因。
一切都必须通过代理服务器进行。请尝试正确配置代理服务器 - Linux应用程序通常使用环境变量http_proxy,https_proxy,但应用程序可能有自己的选项来配置代理服务器,最终您可能需要在源代码级别进行配置。这取决于使用的应用程序/代码。

1
我认为问题在于您在Docker Compose配置文件中使用了主机模式,并且您是否允许了Debian机器上的IPTABLES防火墙端口?Windows呢?
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行,它将按预期工作。


0

你的代码不允许你的容器访问 164.16.240.30:9000。你应该从终端使用 wget 命令下载 164.16.240.30:9000,而不是使用 172.17.240.30:9000


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接