什么是linux相当于"docker.for.mac.host.internal"

klo*_*lor 22 docker docker-for-windows docker-for-mac docker-desktop

在Mac和Windows上,可以在容器内使用docker.for.mac.host.internal(替换docker.for.mac.localhost)和docker.for.win.host.internal(替换docker.for.win.localhost).

是否有一个Linux将开箱即用而不传递env变量.

Sam*_*uel 81

对于 linux 系统,您可以——从20.04docker 引擎的主要版本开始——现在也可以通过host.docker.internal. 这不会自动工作,但您需要提供以下运行标志:

--add-host=host.docker.internal:host-gateway
Run Code Online (Sandbox Code Playgroud)

在此处查看答案:https : //stackoverflow.com/a/61424570/3757139

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

  • 在 CentOS 上运行 `--add-host=host.docker.internal:host-gateway` 时,我收到错误 `invalid argument "host.docker.internal:host-gateway" for "--add-host" flag: invalid add-host 中的 IP 地址:“host-gateway”` 您是否期望需要将 `host-gateway` 替换为实际的主机 IP? (6认同)
  • 有没有办法在 daemon.json 或其他东西中启用此功能?我正在考虑 Rancher 和 Kubernetes 的测试环境,我不想照顾众多容器中的每一个。 (4认同)
  • 神奇的 IP 号起作用了: `--add-host=host.docker.internal:172.17.0.1 \` (3认同)
  • 这对我也有用。在我的例子中,172.17.0.1 是桥接网络的网关地址。如果有人有不同的网络设置,他们可以通过执行 docker 检查来获取此信息。 (2认同)
  • 只有较新的 docker 版本才有神奇的字符串“host-gateway”,它会转换为 docker 默认桥接网络 ip(或使用 docker 桌面时主机的虚拟 IP)。您可以测试运行:`docker run --rm --add-host=host.docker.internal:host-gateway ubuntu:18.04 cat /etc/hosts`,然后查看它是否有效并在主机文件中显示ip(其中应该有一行类似“172.17.0.1 host.docker.internal”的行)。 (2认同)
  • 为什么 Docker 不自动执行此操作?我的意思是,真的... (2认同)

jaw*_*ira 26

如果您使用Docker Compose+ Linux,则必须手动添加它(至少现在是这样)。extra_hosts在您的docker-compose.yaml文件上使用:

version: '3.7'

services:

  fpm:
    build:
      context: .
    extra_hosts:
      - "host.docker.internal:host-gateway"
Run Code Online (Sandbox Code Playgroud)

文档 - https://docs.docker.com/compose/compose-file/compose-file-v3/#extra_hosts

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

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

  • 如果我想访问主机上的端口 3000,这是我从容器访问它的方式:“http://host.docker.internal:3000/”? (14认同)
  • 惊人的!终于我也可以在 Linux 上使用 xdebug 了:-) (4认同)
  • 我尝试过,但对 docker 版本“版本:20.10.17”不起作用 (2认同)
  • 这对 Linux 不起作用。它似乎“思考”了很长时间,然后超时了。 (2认同)

Ant*_*cca 18

这是我的解决方案:

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

然后在 docker-compose 中:

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

  • 在我的 Ubuntu VM 上,这是 172.17.0.1,与上面的答案匹配。 (2认同)
  • 在 Linux/Debian docker 上使用这个命令我什么也得不到。更好的是: `/sbin/ip route|awk '/default/ { print $3 }'` (2认同)

dev*_*nev 15

取决于你想要做什么.如果你正在运行--net=host,localhost应该工作正常.如果您使用的是默认网络,请使用静态IP 172.17.0.1.我怀疑这两个域的行为都不一样.

  • 哇!`172.17.0.1` 确实有效!我在文档或任何抱怨“host.docker.internal”不起作用的论坛中都没有发现这一点。这个IP能保证始终链接到主机吗? (21认同)
  • 我可以证明“172.17.0.1”技巧可以与 GitHub Actions 配合使用! (8认同)
  • 您可以编辑 /etc/hosts 并添加 172.17.0.1 docker.host.internal (4认同)
  • @JulesColle 只要您在默认网络上,它就是“保证”。“172.17.0.1”并不是什么魔术,而只是网络“bridge”的网关,而它恰好是主机。除非另有说明,所有容器都将连接到“bridge”。[参见此处](https://docs.docker.com/engine/tutorials/networkingcontainers/) (2认同)
  • 这并不适用于所有情况。如果您有其他网络,则会创建一个新接口:172.17.0.1、172.18.0.1、172.19.0.1 等(尝试使用“ifconfig”列出所有接口)。您必须手动获取网络的 IP。 (2认同)

dPa*_*Pac 15

太棒了;通过静态IP地址访问主机172.17.0.1

向主机发出 HTTP 请求:

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

  2. 将新的 IP 地址添加到允许的主机

  3. 使用刚刚在您的请求中找到的 IP 地址:req = requests.get('http://172.17.0.1:8000/api/YOUR_ENDPOINT')

  • 这不取决于您的容器在哪个“网络”中运行吗? (3认同)

小智 11

host.docker.internal仅存在于 Windows WSL中,因为 Docker Desktop for Windows 在特殊的 WSL VM Docker-Desktop 内运行 Docker 守护进程。

\n

它有自己的本地主机和自己的 WSL2 接口来与 Windows 进行通信。此虚拟机\xe2\x80\x99t 没有任何静态 IP 地址。每次创建 VM 时都会生成 IP 地址,并通过生成的主机文件中的host.docker.internal传递到每个发行版。虽然没有\xe2\x80\x99t任何网桥或真正的v-switch,但VM内部网络的eth0上打开的所有端口都映射到主机本地网络上,而不是映射到主机的本地网络上。eth0

\n

没有任何真正的网桥和端口映射 - 无需配置。

\n

在 WSL VM 内部,其 Localhost 与 Linux 计算机的 localhost 相同。WSL VM 内的两个进程可以通过本地主机进行通信。跨发行版IPC必须使用host.docker.internal。可以在 WSL VM 内创建桥 - Docker 可以做到这一点。

\n


Jon*_*uis 10

一种解决方案是使用特殊容器将流量重定向到主机.你可以在这里找到这样一个容器: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
Run Code Online (Sandbox Code Playgroud)

  • 为什么这会被贬低?我喜欢这个. (2认同)

mat*_*ish 10

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
Run Code Online (Sandbox Code Playgroud)

它将添加host.docker.internal到您的主机。然后你可以在 xdebug 配置中使用它。

这是 env 变量的示例 docker-compose.yml

XDEBUG_CONFIG: remote_host=host.docker.internal remote_autostart=On remote_enable=On idekey=XDEBUG remote_log=/tmp/xdebug.log remote_port=9999

Run Code Online (Sandbox Code Playgroud)


小智 8

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

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


yam*_*enk 7

对于Linux,主机没有默认的DNS名称。可以通过运行以下命令来验证:

docker run -it alpine cat /etc/hosts
Run Code Online (Sandbox Code Playgroud)

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

netstat -nr | grep '^0\.0\.0\.0' | awk '{print $2}'
Run Code Online (Sandbox Code Playgroud)

或者,您可以通过以下方式将host ip提供给run命令: docker run --add-host dockerHost:<ip-address> ...

  • 这无论如何都不等同。拥有可以通过 dns 解析的东西使您能够将其放入配置文件中,而无需评估或 sed'ing 或其他时髦的东西。 (2认同)

归档时间:

查看次数:

18060 次

最近记录:

6 年 前