使用Docker Compose到达主机

时间:2016-10-03 15:41:43

标签: 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://127.0.0.1:3001
    ports:
  - "3010:3010"

现在,我如何才能到达THE_HOST_I_WANT_TO_CONNECT_TO

我尝试的是:

  • network_mode设为主持人。这没用。无法访问127.0.0.1。
  • 如果我使用主机的本地IP,我还可以看到我可以从容器到达主机。快速入侵是使用ifconfig | grep broadcast | awk '{print $2}'之类的东西来获取IP并在Docker Compose中替换它。由于此IP可以在重新连接时更改,并且不同的设置可能会有不同的ifconfig结果,因此我正在寻找更好的解决方案。

2 个答案:

答案 0 :(得分:2)

我在docker issue #1143的评论中使用了另一个hack / workarkound。似乎暂时适用于我...具体来说,我在 Dockerfile 中添加了以下几行:

# - net-tools contains netstat, used to discover IP of Docker host server.
#   NOTE: the netstat trick is to make Docker host server accessible
#   from inside Docker container under name 'dockerhost'. Unfortunately,
#   as of 2016.10, there's no official/robust way to do this when Docker host
#   has no public IP/DNS entry. What is used here is built based on:
#   - https://github.com/docker/docker/issues/1143#issuecomment-39364200
#   - https://github.com/docker/docker/issues/1143#issuecomment-46105218
#   See also:
#   - http://stackoverflow.com/q/38936738/98528
#   - https://github.com/docker/docker/issues/8395#issuecomment-200808798
#   - https://github.com/docker/docker/issues/23177
RUN apt-get update && apt-get install -y net-tools
CMD (netstat -nr | grep '^0\.0\.0\.0' | awk '{print $2" dockerhost"}' >> /etc/hosts) && \
        ...old CMD...

有了这个,我可以使用 dockerhost 作为安装Docker的主机的名称。如上所述,这基于:

其中netstat -nr means

  

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

答案 1 :(得分:0)

这是Docker Compose的一个已知问题:请参阅Document how to connect to Docker host from container #1143。 <{1}}中dockerhost条目的建议解决方案尚未实施。

我找到了一个shell变量的解决方案,a comment amcdl在问题上的建议:

创建/etc/hosts变量:LOCAL_XX_HOST

然后,例如,在export LOCAL_XX_HOST="http://$(ifconfig en0 inet | grep "inet " | awk -F'[: ]+' '{ print $2 }'):3001"中引用此变量,如下所示:

docker-compose