[英]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.