无法从WSL2停靠容器连接到WSL2本地主机服务器

rta7y2nd  于 2022-10-23  发布在  Docker
关注(0)|答案(2)|浏览(348)

我在我的WSL2 Ubuntu上的https://0.0.0.0:4000(也可以作为https://local.phx-cd.shoepping.at:4000访问,在Ubuntu主机文件中Map到127.0.0.1)上运行一个简单的Web服务器。我可以从Ubuntu和Windows主机连接到它--到目前为止还不错。但另外,在我的Docker for Win与WSL2集成中,我运行了一个SelSelum Chrome容器,它连接和测试Web服务器上的东西(使用网桥),但它无法连接到它!
我连接到容器,并试图 curl 到Web服务器-连接被拒绝。因为我的电脑有双重引导,我试着切换到我的Linux发行版,在那里运行Web服务器,在Linux Docker中运行Selify,并连接到本地Web服务器。所以我认为这与WSL2有关。
我的docker-compose.yaml(我遗漏了Selify集线器配置)

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

如果您需要更多配置,请告诉我。谢谢。

yjghlzjz

yjghlzjz1#

您确定Ubuntu WSL2示例正在桥接运行吗?默认情况下,WSL2示例运行NAT‘d(而WSL1示例运行桥接)。因此,虽然Docker网络是桥接的,但如果没有一些额外的工作,它仍然无法访问NAT的WSL2虚拟机。
我非常肯定您遇到了WSL issue #4150中描述的根本问题。如果是这样的话,下面是一些值得尝试的事情。

选项#1-端口转发到WSL2示例

在GitHub问题中有几个建议的解决方法,但适用于您的情况的基本方法归结为将端口4000从Windows主机接口转发到WSL2示例的专用IP地址。在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>
1.使用wsl --import <NewDistroName> <InstallLocation> <FileNameOfBackup> --version 1将备份导入新的WSL1示例
简单地更改版本是可能的,但我倾向于在这样做之前无论如何都要有一个备份,而且只要你在备份,你最好把原始版本留在原处。

可能的选项#3-socat转发或隧道

虽然我没有直接测试您的特定用例,但我已经成功地尝试了WSL2中的socat。从外观上看,socat可以用于从WSL2到(至少)Windows主机(Docker容器可以访问)的端口转发。请看这条评论,这是GitHub上关于与您相似的用例的一个例子。

可能的选项#4-网桥模式下的WSL2

上面提到的GitHub线程还包含有关如何使用Hyper-V在WSL2接口上启用桥接模式的一些详细信息。我认为这需要Windows 10专业版或企业版。同样,如果端口转发或WSL1可以完成您所需的任务,那么在这种情况下,这可能是过度杀伤力。

b4wnujal

b4wnujal2#

以管理员身份在PowerShell上运行以下命令:
{#requiredWindowsPort}替换为将在浏览器中使用的端口
{#requiredWSL2Port}替换为您要连接到的在WSL2中运行的端口。

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

相关问题