在 Mac 和 Windows 上,可以在容器内使用 host.docker.internal
(Docker 18.03+)。
是否有类似的方法适用于 Linux,并且可以直接使用而无需传递环境变量或使用各种 CLI 命令进行提取?
在 Mac 和 Windows 上,可以在容器内使用 host.docker.internal
(Docker 18.03+)。
是否有类似的方法适用于 Linux,并且可以直接使用而无需传递环境变量或使用各种 CLI 命令进行提取?
这要看你想做什么。如果你正在使用 --net=host
,localhost
应该可以正常工作。如果你使用默认网络,请使用静态 IP 172.17.0.1
。我认为两种方式都不能像那些域名一样表现。
172.17.0.1
竟然有效!我在文件和所有抱怨 host.docker.internal
无法使用的论坛中都找不到这个信息。这个 IP 地址是否保证始终链接到主机? - Jules Colle172.17.0.1
这个技巧可以在 GitHub Actions 中使用! - Alex172.17.0.1
并不是什么魔术,而只是网络bridge
的网关,恰好与主机相同。除非另有规定,否则所有容器都将连接到bridge
。在这里查看。 - FirefoxMetzger对于Linux系统,您可以从docker引擎的主要版本20.04
开始,现在也可以通过host.docker.internal
与主机通信。这不会自动工作,但您需要提供以下运行标志:
--add-host=host.docker.internal:host-gateway
查看答案: https://dev59.com/YV0Z5IYBdhLWcg3wiw4w#61424570
同时也可以查看下面这个答案,以添加到docker-compose文件中 - https://dev59.com/O1YM5IYBdhLWcg3wpRfa#67158212
--add-host=host.docker.internal:host-gateway
时,我收到了错误信息invalid argument "host.docker.internal:host-gateway" for "--add-host" flag: invalid IP address in add-host: "host-gateway"
。您是否希望用实际的主机IP地址来替换host-gateway
? - mummybot--add-host=host.docker.internal:172.17.0.1 \
。该命令会将 host.docker.internal
映射到 IP 地址 172.17.0.1
上。 - mummybotdocker run --rm --add-host=host.docker.internal:host-gateway ubuntu:18.04 cat /etc/hosts
,然后查看是否有效并展示主机文件中的IP地址(其中应该有一行类似于172.17.0.1 host.docker.internal
)。 - Lucas Basquerotto如果你正在使用 Docker Compose
+ Linux
,你需要手动添加它(至少目前是这样)。在你的docker-compose.yaml
文件中使用extra_hosts
:
version: '3.7'
services:
fpm:
build:
context: .
extra_hosts:
- "host.docker.internal:host-gateway"
http://host.docker.internal:3000/
? - Javohir Mirzo Fazliddinov一种解决方法是使用特殊容器将流量重定向到主机。您可以在此处找到这样的容器: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
这是我的解决方案:
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}
/sbin/ip route|awk '/default/ { print $3 }'
。 - GetoXip route
示例打印网关,而不是 docker0
io。下面的命令应该可以工作:# ip route | awk '/docker0/ {print $9}'
- Adam Shand对于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> ...
命令向运行命令提供主机IP。
grep | awk
可以简化为只用 awk:awk '/^0\.0\.0\.0/{print $2}'
:) - cviejotldr; 通过静态IP 172.17.0.1
访问主机。
向主机发出HTTP请求:
运行以下命令获取静态IP地址:ip addr show | grep "\binet\b.*\bdocker0\b" | awk '{print $2}' | cut -d '/' -f 1
将新的IP地址添加到允许的主机中
在请求中使用刚找到的IP地址:req = requests.get('http://172.17.0.1:8000/api/YOUR_ENDPOINT')
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
中环境变量的示例:
XDEBUG_CONFIG: remote_host=host.docker.internal remote_autostart=On remote_enable=On idekey=XDEBUG remote_log=/tmp/xdebug.log remote_port=9999
host.docker.internal只存在于Windows WSL环境中,因为Docker Desktop for Windows将Docker守护程序运行在特殊的WSL VM Docker-Desktop内部。它有自己的本地主机名和自己的WSL2接口,用于与Windows通信。这个VM没有固定的IP地址,每次创建VM时都会生成一个新的IP地址,并通过生成的/etc/hosts文件传递到每个发行版中的host.docker.internal中。虽然没有桥接或实际的虚拟交换机,但在VM内部网络上打开的所有端口都映射到主机的本地网络上,但不映射到主机的eth0上。
没有真正的桥接和端口映射 - 没有什么需要配置的。在WSL VM内部,它的本地主机名与Linux机器的localhost相同。WSL VM内的两个进程可以通过localhost通信。跨发行版IPC必须使用host.docker.internal。在WSL VM内部,可以创建桥接-Docker这样做。