使用Docker Compose到达主机

使用Docker Compose到达主机,docker,docker-compose,Docker,Docker Compose,我有一个Docker Compose v2文件,它启动了一个容器。我在端口3001上本地运行服务。我想从Docker容器访问此服务 Docker Compose文件如下所示: version: '2' services: my-thingy: image: my-image:latest #network_mode: host #DOES not help environment: - THE_HOST_I_WANT_TO_CONNECT_TO=http:

我有一个Docker Compose v2文件,它启动了一个容器。我在端口3001上本地运行服务。我想从Docker容器访问此服务

Docker Compose文件如下所示:

version: '2'
services:
  my-thingy:
    image: my-image:latest
    #network_mode: host #DOES not help
    environment:
      - THE_HOST_I_WANT_TO_CONNECT_TO=http://127.0.0.1:3001
    ports:
  - "3010:3010"
my-thingy:
    image: my-image:latest
    environment:
      - THE_HOST_I_WANT_TO_CONNECT_TO=${LOCAL_XX_HOST}
现在,我如何才能到达我想要连接的主机

我尝试的是:

  • 将网络模式设置为主机。这不起作用。无法访问127.0.0.1
  • 我还可以看到,如果我使用主机的本地IP,我可以从容器到达主机。一个快速的破解方法是使用类似于
    ifconfig | grep broadcast | awk{print$2}'
    的东西来获取IP并替换Docker Compose中的IP。由于此IP可以在重新连接时更改,并且不同的设置可以有不同的
    ifconfig
    结果,因此我正在寻找更好的解决方案

    • 这是Docker Compose的一个已知问题:请参阅。未实施
      /etc/hosts
      dockerhost
      条目的建议解决方案

      我选择了使用shell变量的解决方案,正如在关于该问题的中所建议的:

      创建一个
      LOCAL_XX_HOST
      变量:
      export LOCAL_XX_HOST=“http://$(ifconfig en0 inet | grep“inet”| awk-F'[:]+'{print$2}'):3001”

      然后,例如,在
      docker compose
      中引用此变量,如下所示:

      version: '2'
      services:
        my-thingy:
          image: my-image:latest
          #network_mode: host #DOES not help
          environment:
            - THE_HOST_I_WANT_TO_CONNECT_TO=http://127.0.0.1:3001
          ports:
        - "3010:3010"
      
      my-thingy:
          image: my-image:latest
          environment:
            - THE_HOST_I_WANT_TO_CONNECT_TO=${LOCAL_XX_HOST}
      

      我已经使用了另一个来自评论的hack/workarkound。似乎对我有用™ 暂时。。。具体而言,我在Dockerfile中添加了以下几行:

      这样,我就可以使用dockerhost作为安装Docker的主机名。如上所述,这是基于:

      • (…)一种方法是依赖这样一个事实:Docker主机可以通过Docker桥的地址访问,而Docker桥恰好是容器的默认网关。换句话说,在这种情况下,您可能只需要对
        ip路由ls | grep^default
        进行巧妙的解析。当然,它依赖于实现细节(默认网关恰好是Docker主机的IP地址),将来可能会更改。(……)

      • (…)很多像我们这样的人都在寻找这样的小新闻

        netstat -nr | grep '^0\.0\.0\.0' | awk '{print $2}'
        
      其中:

      Netstat打印有关Linux网络子系统的信息。
      (…)
      --路线-r
      显示内核路由表。
      (…)
      --数字,-n
      显示数字地址,而不是试图确定符号主机、端口或用户名