簡體   English   中英

無法從 WSL2 docker 容器連接到 WSL2 localhost 服務器

[英]Can't connect to WSL2 localhost server from WSL2 docker container

I am running a simple web server on https://0.0.0.0:4000 (accessible also as https://local.phx-cd.shoepping.at:4000 with mapping to 127.0.0.1 in Ubuntu hosts file) on my WSL2 Ubuntu。 我可以從 Ubuntu 和 Windows 主機連接到它 - 到目前為止一切都很好。 但此外,在我的 Docker for Win 與 WSL2 集成中,我運行了一個 selenium chrome 容器,它正在連接和測試 web 服務器上的東西(使用橋接器),但它不能連接到它!

我連接到容器並嘗試將 curl 連接到 web 服務器 - 連接被拒絕。 Since I have dual boot on my computer, I tried to switch to my Linux distro, run web server there and selenium in Linux Docker and connection to the local web server worked. 所以我認為這與WSL2有關。

我的 docker-compose.yaml(我遺漏了我的 selenium 集線器配置)

selenium-chrome-local:
      image: selenium/node-chrome-debug:3.141.59
      restart: always
      ports:
        - 5901-5902:5900
      volumes:
        - /dev/shm:/dev/shm
        - ../../temp:/home/seluser/Downloads
      depends_on:
        - selenium-hub-local
      environment:
        - SCREEN_WIDTH=1920
        - SCREEN_HEIGHT=1080
      extra_hosts:
        - "local.phx-cd.shoepping.at:10.99.99.1"
      networks:
        - selgrid
        - dockerhost

 networks:
    selgrid:
    dockerhost:
      driver: bridge
      ipam:
        config:
          - subnet: 10.99.99.0/24

如果您需要更多配置,請告訴我。 謝謝。

您確定 Ubuntu WSL2 實例正在橋接運行嗎? 默認情況下,WSL2 實例運行 NAT'd(而 WSL1 實例運行橋接)。 所以,雖然是的,Docker 網絡是橋接的,但如果沒有一些額外的工作,它仍然無法訪問 NAT'd WSL2 VM。

我相當確定您遇到了WSL 問題 #4150中描述的根本問題。 如果是這樣,這里有一些事情可以嘗試......

選項 #1 - 端口轉發到 WSL2 實例

在 Github 問題中建議了幾種解決方法,但適用於您的案例的基礎知識歸結為將端口 4000 從 Windows 主機接口轉發到 WSL2 實例的私有 ZA12A3079E14CED46E69BA52B 地址。 在 PowerShell 中:

netsh interface portproxy delete v4tov4 listenport="4000" # Delete any existing port 4000 forwarding
$wslIp=(wsl -d Ubuntu -e sh -c "ip addr show eth0 | grep 'inet\b' | awk '{print `$2}' | cut -d/ -f1") # Get the private IP of the WSL2 instance
netsh interface portproxy add v4tov4 listenport="4000" connectaddress="$wslIp" connectport="4000"

請注意,您需要在每次重新啟動后執行此操作,或者設置一個在登錄時運行的腳本,如 Github 問題中所述(請參閱此評論)。

選項 #2 - WSL1

我還建議,假設它適合您的工作流程,並且如果您的 web 應用程序在其上運行,您可以簡單地使用 WSL1 而不是 WSL2。 您可以通過以下方式嘗試:

  1. 備份現有發行版(來自 PowerShell 或 cmd,使用wsl --export <DistroName> <FileName>
  2. 使用wsl --import <NewDistroName> <InstallLocation> <FileNameOfBackup> --version 1將備份導入新的 WSL1 實例

可以簡單地更改版本,但我傾向於在這樣做之前進行備份,並且只要您在備份,您最好將原始版本保留在原位。

可能的選項 #3 - socat轉發或隧道

雖然我沒有直接測試您的特定用例,但我已經成功地在 WSL2 中使用了socat 從它的外觀來看, socat可用於從 WSL2 到(至少)Windows 主機的端口轉發(Docker 容器可以訪問該主機。請參閱關於 ZE1ADBCBB92C622D0B3E619F9D07 的類似用例的此評論和示例。

可能的選項 #4 - 橋接模式下的 WSL2

上面引用的 Github 線程也有一些關於如何使用 Hyper-V 在 WSL2 接口上啟用橋接模式的詳細信息。 我相信這需要 Windows 10 專業版或企業版。 它也必須在每次重新啟動后完成,就像選項 1 一樣。同樣,對於這種情況,如果端口轉發或 WSL1 可以完成您需要的事情,這可能是多余的。

以管理員身份在 PowerShell 上運行此命令:

將 {#requiredWindowsPort} 替換為將在瀏覽器中使用的端口

將 {#requiredWSL2Port} 替換為您要連接到的 WSL2 中運行的端口。

netsh interface portproxy add v4tov4 listenport={#requiredWindowsPort} listenaddress=0.0.0.0 connectport={#requiredWSL2Port} connectaddress=$($(wsl hostname -I).Trim());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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