在Mac和Windows上,可以在容器内部使用host.docker.internal (Docker 18.03+)。

Linux上是否有一种不需要传递env变量或使用各种CLI命令提取它就能开箱即用的方法?


当前回答

这取决于你想做什么。如果您使用——net=host运行,那么localhost应该可以正常工作。如果使用默认网络,请使用静态IP 172.17.0.1。我怀疑这两个领域的表现都不会与那些领域完全相同。

其他回答

这取决于你想做什么。如果您使用——net=host运行,那么localhost应该可以正常工作。如果使用默认网络,请使用静态IP 172.17.0.1。我怀疑这两个领域的表现都不会与那些领域完全相同。

这是我的解决方案:

IP_ADDRESS=$(ip addr show | grep "\binet\b.*\bdocker0\b" | awk '{print $2}' | cut -d '/' -f 1)

然后在docker-compose中:

extra_hosts:
  docker.host: ${IP_ADDRESS}

对于linux,主机没有缺省的DNS名称。可以通过以下命令进行验证:

docker run -it alpine cat /etc/hosts

此功能已被请求,但尚未实现。您可以检查这个问题。如前所述,您可以使用以下命令从容器中查找主机的IP。

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

或者,您也可以通过docker run——add-host dockerHost为run命令提供主机ip:<ip-address>…

一种解决方案是使用特殊的容器将流量重定向到主机。您可以在这里找到这样一个容器:https://github.com/qoomon/docker-host。其思想是从容器中获取默认路由,并将其安装为传入连接的NAT网关。

一个假想的用法:

docker-host:
  image: qoomon/docker-host
  cap_add: [ 'NET_ADMIN', 'NET_RAW' ]
  restart: on-failure
  environment:
    - PORTS=999

some-service:
  image: ...
  environment:
    SERVER_URL: "http://docker-host:999"
  command: ...
  depends_on:
    - docker-host

host.docker.internal exists only in Windows WSL because Docker Desktop for Windows runs Docker daemon inside the special WSL VM Docker-Desktop. It has its own localhost and its own WSL2 interface to communicate with Windows. This VM has no static IP. The IP is generated every time when VM is created and passed via host.docker.internal in the generated /etc/hosts to every distro. Although there is no bridge or real v-switch all ports opened on eth0 of VM internal network are mapped on the host Local network, BUT NOT ON THE ETH0 OF THE HOST. There is no real bridge and port mapping - nothing to configure. Inside WSL VM its Localhost is the same as the localhost of the Linux machine. 2 processes inside WSL VM can communicate via localhost. Cross-distro IPC must use host.docker.internal. It is possible to create bridge inside WSL VM -Docker does it.