[英]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中描述的根本問題。 如果是這樣,這里有一些事情可以嘗試......
在 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 問題中所述(請參閱此評論)。
我還建議,假設它適合您的工作流程,並且如果您的 web 應用程序在其上運行,您可以簡單地使用 WSL1 而不是 WSL2。 您可以通過以下方式嘗試:
wsl --export <DistroName> <FileName>
wsl --import <NewDistroName> <InstallLocation> <FileNameOfBackup> --version 1
將備份導入新的 WSL1 實例可以簡單地更改版本,但我傾向於在這樣做之前進行備份,並且只要您在備份,您最好將原始版本保留在原位。
socat
轉發或隧道雖然我沒有直接測試您的特定用例,但我已經成功地在 WSL2 中使用了socat
。 從它的外觀來看, socat
可用於從 WSL2 到(至少)Windows 主機的端口轉發(Docker 容器可以訪問該主機。請參閱關於 ZE1ADBCBB92C622D0B3E619F9D07 的類似用例的此評論和示例。
上面引用的 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.