【问题标题】:No route to host within docker container没有路由到 docker 容器内的主机
【发布时间】:2020-03-07 18:51:09
【问题描述】:

我在 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

【问题讨论】:

  • 尝试通过wget模拟浏览器,如stackoverflow.com/questions/43182879/using-wget-to-fake-browser可能是防火墙切断了连接。如果已安装并启用,也尝试禁用 ufw(wiki.debian.org/Uncomplicated%20Firewall%20%28ufw%29): "sudo service ufw stop"。
  • 你的容器需要访问164.16.240.30:9000,它没有在你的机器上运行。您的浏览器可以访问此 164.16.240.30:9000 资源,但容器没有。我对吗?为什么您试图从终端获取不同的资源 172.17.240.30:9000 而不是 164.16.240.30:9000
  • 请确保您的 ~/.wgetrc 文件中没有任何代理条目。
  • 据我了解,tokengeneratorapi 代理对某些 sonar_server 的请求。它是否正确 ?我们是否确定 tokengeneratorapi 正确转发到端口 9000 ?下一步可能是登录到您的容器,并使用 get 或 curl 定位声纳服务器:9000。如果没问题,以您的 tokengeneratorapi “应用程序”为目标,例如 127.0.0.1:9000 并确保它正确转发(仍然在容器内
  • 仍然不清楚你的问题,你是说'从容器中你无法访问 164.16.240.30:9000 吗?当您说I log in to the terminal and run 时,您在容器内吗?以及为什么您使用不同的 IP 172.17.240.30 与 164.16.240.30

标签: docker networking docker-compose dockerfile containers


【解决方案1】:

似乎是容器存在连接问题,因此您提出的解决方案可能不起作用,因为这只是将主机端口映射到容器端口(考虑到您的目标 URL 不是实际主机)。

查看https://docs.docker.com/compose/compose-file/#network_mode 并尝试将其设置为主机。

【讨论】:

  • 试过这个没用,请看更新的问题
  • 添加到这个看起来好像'host'在非Linux主机上不起作用docs.docker.com/network/network-tutorial-host
  • 很好,对此我深表歉意!你能确认这不是防火墙问题吗?防火墙需要允许 docker 容器通过主机进行连接。
  • 我不确定我会怎么做,因为主机是 Windows 10。此外,互联网连接工作例如 wget www.google.co.uk 返回 200。也许这是一个 linux 的东西,也许是 iptables?跨度>
  • 您是否在使用公司代理?试试docker network prune。另外,图片的依据是什么?
【解决方案2】:

您的浏览器可以访问164.16.240.30:9000,因为它通过代理(典型的企业环境),所以the proxy 具有到164.16.240.30 的网络连接。这并不意味着您的主机也具有相同的网络连接。实际上,您的主机似乎没有那个。这就是为什么从容器或终端直接 wget 有错误No route to host 的原因。

一切都必须通过代理。尝试正确配置代理 - linux 应用程序通常使用环境变量http_proxy,https_proxy,但应用程序可能有自己的选项来配置代理,最终您可以在源代码级别进行配置。这取决于使用的应用程序/代码。

【讨论】:

    【解决方案3】:

    我认为问题在于您在 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 行,它会按预期工作。

    【讨论】:

      【解决方案4】:

      您的代码不允许您的容器访问164.16.240.30:9000。你应该从终端获取164.16.240.30:9000 而不是172.17.240.30:9000

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-18
        相关资源
        最近更新 更多