繁体   English   中英

没有到 docker 容器内主机的路由

[英]No route to host within docker container

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

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM