在Docker容器中没有主机托管的途径

时间:2020-03-07 18:51:09

标签: docker networking docker-compose dockerfile containers

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

4 个答案:

答案 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