簡體   English   中英

什么是 linux 相當於“host.docker.internal”

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM