Linux 中的“host.docker.internal”等价物是什么? [重复]

问题描述 投票:0回答:11

在 Mac 和 Windows 上,可以在容器内使用

host.docker.internal
(Docker 18.03+)。

Linux 上是否有一款可以开箱即用,无需传递环境变量或使用各种 CLI 命令提取它?

docker docker-for-windows docker-for-mac docker-desktop
11个回答
299
投票

取决于你想做什么。如果您使用

--net=host
运行,则
localhost
应该可以正常工作。如果您使用默认网络,请使用静态 IP
172.17.0.1
。我怀疑它们的行为都不会与这些域完全相同。


225
投票

对于 Linux 系统,您可以 - 从 docker 引擎的主要版本

20.04
开始 - 现在还可以通过
host.docker.internal
与主机通信。这不会自动工作,但您需要提供以下运行标志: --add-host=host.docker.internal:host-gateway

请参阅此处的答案:
https://stackoverflow.com/a/61424570/3757139

另请参阅下面的答案以添加到 docker-compose 文件 -

https://stackoverflow.com/a/67158212/243392


193
投票
Docker Compose

+

Linux
,则必须手动添加(至少目前如此)。在您的
extra_hosts
文件上使用
docker-compose.yaml
version: '3.7'

services:

  fpm:
    build:
      context: .
    extra_hosts:
      - "host.docker.internal:host-gateway"

不要忘记更新 Docker,因为这只适用于 
Docker v20.10+

来源:

https://github.com/docker/for-linux/issues/264#issuecomment-784985736


32
投票
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



21
投票

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}



17
投票

docker run -it alpine cat /etc/hosts

已请求此功能,但尚未实现。您可以检查这个
问题

。正如所讨论的,您可以使用以下命令从容器中查找主机的 IP。 netstat -nr | grep '^0\.0\.0\.0' | awk '{print $2}'

或者,您可以通过 
docker run --add-host dockerHost:<ip-address> ...

 向运行命令提供主机 IP
    


15
投票
tldr;通过静态IP访问主机

172.17.0.1


向主机发出 HTTP 请求:

    运行以下命令获取静态IP:
  1. ip addr show | grep "\binet\b.*\bdocker0\b" | awk '{print $2}' | cut -d '/' -f 1

    
    

  2. 将新IP添加到允许的主机
  3. 使用刚刚在您的请求中找到的 IP 地址:
  4. req = requests.get('http://172.17.0.1:8000/api/YOUR_ENDPOINT')

    
    


14
投票
https://github.com/docker/for-linux/issues/264

IP=$(ip -4 route list match 0/0 | awk '{print $3}') echo "Host ip is $IP" echo "$IP host.docker.internal" | sudo tee -a /etc/hosts

它将把 
host.docker.internal

添加到您的主机。然后你就可以在 xdebug 配置中使用它了。

这是 

docker-compose.yml

 中的 env 变量示例
XDEBUG_CONFIG: remote_host=host.docker.internal remote_autostart=On remote_enable=On idekey=XDEBUG remote_log=/tmp/xdebug.log remote_port=9999



11
投票


9
投票

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


1
投票
mysql

作为主机名,因为这是我的 docker-compose 中的服务名称

    

© www.soinside.com 2019 - 2024. All rights reserved.