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

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


当前回答

一种解决方案是使用特殊的容器将流量重定向到主机。您可以在这里找到这样一个容器: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

其他回答

对于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>…

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

一种解决方案是使用特殊的容器将流量重定向到主机。您可以在这里找到这样一个容器: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

使用docker0接口ip(比如172.17.0.1)可能是一个很好的解决方案。

只要确保您需要访问的服务侦听外部连接即可。一个典型的例子是Mysql,默认绑定到127.0.0.1,导致无法访问,直到你允许外部连接。绑定到0.0.0.0)

tldr;通过静态IP 172.17.0.1访问主机

对主机进行HTTP请求:

IP addr show | grep "\binet\b.执行以下命令获取静态IP地址。* \ bdocker0 \ b”| awk的{打印$ 2}| 1 - d ' / ' - f 添加新的IP到允许的主机 使用刚刚在请求中找到的IP地址:req = requests.get('http://172.17.0.1:8000/api/YOUR_ENDPOINT')