我有一个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。ifconfig | grep broadcast | awk '{print $2}'
之类的东西来获取IP并在Docker Compose中替换它。由于此IP可以在重新连接时更改,并且不同的设置可能会有不同的ifconfig
结果,因此我正在寻找更好的解决方案。答案 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的主机的名称。如上所述,这基于:
(...)一种方法是依赖Docker主机可以通过Docker桥的地址访问的事实,Docker桥恰好是容器的默认网关。换句话说,在这种情况下,您可能只需要巧妙地解析
ip route ls | grep ^default
。当然,它依赖于实现细节(默认网关恰好是Docker主机的IP地址),将来可能会发生变化。 (...)
(...)很多像我们这样的人正在寻找像这样的小花絮
netstat -nr | grep '^0\.0\.0\.0' | awk '{print $2}'
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