[英]What is linux equivalent of “host.docker.internal”
在 Mac 和 Windows 上,可以使用
docker.for.mac.host.internal
(替换
docker.for.mac.localhost
)和
docker.for.win.host.internal
(替换
docker.for.win.localhost
)
host.docker.internal
(Docker 18.03+) 容器内。
有没有一种适用于 Linux 的工具可以在不传递 env 变量或使用各种 CLI 命令提取它的情况下开箱即用?
取决于你想做什么。 如果您使用--net=host
运行,则localhost
应该可以正常工作。 如果您使用默认网络,请使用静态 IP 172.17.0.1
。 我怀疑它们的行为都不会与那些域完全相同。
对于 linux 系统,从host.docker.internal
引擎的主要版本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
一种解决方案是使用特殊容器将流量重定向到主机。 你可以在这里找到这样的容器: 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
如果您使用的是Docker Compose
+ Linux
,则必须手动添加它(至少现在是这样)。 在extra_hosts
docker-compose.yaml
文件中使用extra_hosts
:
version: '3.7'
services:
fpm:
build:
context: .
extra_hosts:
- "host.docker.internal:host-gateway"
文档 - 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
这是我的解决方案:
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:<ip-address> ...
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 变量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
使用 docker0 接口 ip,比如 172.17.0.1,可能是一个很好的解决方法。
只需确保您需要访问的服务侦听外部连接。 一个典型的例子是 Mysql 默认绑定到 127.0.0.1,导致无法访问,直到您允许外部连接(例如绑定到 0.0.0.0)
host.docker.internal 仅存在于 Windows WSL 中,因为 Docker Desktop for Windows 在特殊的 WSL VM Docker-Desktop 内运行 Docker 守护进程。 它有自己的本地主机和自己的 WSL2 接口来与 Windows 通信。 此 VM 没有静态 IP。 每次创建 VM 时都会生成 IP,并通过生成的 /etc/hosts 中的 host.docker.internal 传递给每个发行版。 尽管没有网桥或真正的 v-switch,所有在 VM 内部网络的 eth0 上打开的端口都映射到主机本地网络上,但不在主机的 ETH0 上。 没有真正的网桥和端口映射 - 无需配置。 在 WSL VM 中,它的 Localhost 与 Linux 机器的 localhost 相同。 WSL VM 中的 2 个进程可以通过 localhost 进行通信。 跨发行版 IPC 必须使用 host.docker.internal。 可以在 WSL VM 内部创建网桥——Docker 做到了。
要在 Linux 中允许内部 HTTP 请求,请使用静态 IP 172.17.0.1
运行以下命令获取静态IP
$(ip addr show | grep "\\binet\\b.*\\bdocker0\\b" | awk '{print $2}' | cut -d '/' -f 1)
将新 IP 添加到允许的主机
现在使用此 IP 更改请求 URL
req = requests.get('http://172.17.0.1:8000/api/YOUR_ENDPOINT')
对于 linux,我可以使用我尝试连接的服务名称,例如我的一个容器 (php-fpm) 尝试连接到 mysql,所以我使用mysql
作为主机名,因为这是服务名称我的 docker-compose
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.