在 Mac 和 Windows 上,可以在容器内使用
host.docker.internal
(Docker 18.03+)。
Linux 上是否有一款可以开箱即用,无需传递环境变量或使用各种 CLI 命令提取它?
取决于你想做什么。如果您使用
--net=host
运行,则 localhost
应该可以正常工作。如果您使用默认网络,请使用静态 IP 172.17.0.1
。我怀疑它们的行为都不会与这些域完全相同。
。这个想法是从容器内获取默认路由并将其安装为传入连接的 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}
172.17.0.1
ip addr show | grep "\binet\b.*\bdocker0\b" | awk '{print $2}' | cut -d '/' -f 1
req = requests.get('http://172.17.0.1:8000/api/YOUR_ENDPOINT')
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
只需确保您需要访问的服务侦听外部连接即可。一个典型的例子是 Mysql 默认绑定到 127.0.0.1,导致无法访问,直到您允许外部连接(例如绑定到 0.0.0.0)
mysql
作为主机名,因为这是我的 docker-compose 中的服务名称