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

2024-02-07

我正在运行一个简单的网络服务器https://0.0.0.0:4000 https://0.0.0.0:4000(也可以作为https://local.phx-cd.shoeping.at:4000 https://local.phx-cd.shoepping.at:4000在我的 WSL2 Ubuntu 上映射到 Ubuntu 主机文件中的 127.0.0.1。我可以从 Ubuntu 和 Windows 主机连接到它 - 到目前为止一切顺利。但此外,在我的带有 WSL2 集成的 Docker for Win 中,我运行了一个 selenium chrome 容器,它正在连接和测试该 Web 服务器上的内容(使用网桥),但它无法连接到它!

我连接到容器并尝试卷曲到 Web 服务器 - 连接被拒绝。由于我的计算机上有双启动,我尝试切换到我的 Linux 发行版,在那里运行 Web 服务器,并在 Linux Docker 中运行 selenium,并且与本地 Web 服务器的连接有效。所以我认为这与WSL2有关。

我的 docker-compose.yaml (我遗漏了我的 selenium hub 配置)

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(而 WSL1 实例运行桥接)。因此,虽然 Docker 网络是桥接的,但如果不进行一些额外的工作,它仍然无法访问 NAT 的 WSL2 VM。

我相当确定您遇到了中描述的根本问题WSL 问题 #4150 https://github.com/microsoft/WSL/issues/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 问题中所述(请参阅这条评论 https://github.com/microsoft/WSL/issues/4150#issuecomment-504209723).

选项 #2 - WSL1

我还建议,假设它适合您的工作流程,并且您的 Web 应用程序在其上运行,您可以简单地使用 WSL1 而不是 WSL2。您可以通过以下方式尝试一下:

  1. 备份现有发行版(从 PowerShell 或 cmd,使用wsl --export <DistroName> <FileName>
  2. 将备份导入到新的 WSL1 实例中wsl --import <NewDistroName> <InstallLocation> <FileNameOfBackup> --version 1

可以简单地更改版本,但我倾向于在执行此操作之前先进行备份,并且只要您进行备份,您也可以将原始版本保留在原处。

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

虽然我没有直接测试您的特定用例,但我已经尝试过socat在 WSL2 中取得成功。从它的外观来看socat可用于从 WSL2 到(至少)Windows 主机(Docker 容器可以访问)的端口转发。看这条评论 https://github.com/microsoft/WSL/issues/4619#issuecomment-601429273GitHub 上有一个与您类似的用例的示例。

可能的选项 #4 - WSL2 处于桥接模式

上面引用的 GitHub 线程还提供了有关如何使用 Hyper-V 在 WSL2 接口上启用桥接模式的一些详细信息。我相信这需要 Windows 10 专业版或企业版。与选项 1 一样,它还必须在每次重新启动后完成。同样,如果端口转发或 WSL1 可以满足您的需要,那么对于这种情况可能有点过分了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法从 WSL2 docker 容器连接到 WSL2 本地主机服务器 的相关文章

随机推荐

  • 如何在android中以编程方式打开文件夹?

    我正在开发一个打开文件夹的Android应用程序 我的问题是如何在 Android 中以编程方式打开文件夹 我尝试了 stack overflow 中提供的所有解决方案并在 Google 中搜索 但找不到解决方案 有人可以给我答案吗 提前致
  • Wifi 睡眠,即使有锁

    总结 即使获取了wifi锁 当手机使用电池运行时 wifi也会在一段时间后断开 我已将问题简化为带有启动线程的按钮的单个活动 它只是向 PC 上运行的回显服务器发送 100 000 个字符串 每 100 毫秒一个字符串 请参阅下面的代码 我
  • 在 JavaScript 中从表格单元格获取值...而不是 jQuery

    我不敢相信这花了我多长时间 但当我使用 JavaScript 迭代表格时 我似乎无法弄清楚如何从 HTML 表格中提取单元格值 我正在使用以下内容进行迭代 var refTab document getElementById ddRefer
  • Android (Lollipop) EditText onFocus 多次触发

    我有几个带有 onFocusChangeListener 的 EditText When the field gains or loses focus txtMinimumValue setOnFocusChangeListener new
  • 可以在C++中使用正则表达式吗?

    重复 C 中有一个使用模式匹配 使用正则表达式 的函数吗 https stackoverflow com questions 329517 there is a function to use pattern matching using
  • 将函数动态应用到 Postgres 表中的所有列

    使用 Postgres 13 1 我想对表的所有列应用前向填充函数 前向填充函数在我之前的问题中进行了解释 如何将前向填充作为 PL PGSQL 函数 https stackoverflow com questions 70987689 h
  • 创建应用程序域并加载程序集

    我想创建一个具有默认权限的应用程序域 并以默认权限将程序集加载到应用程序域中 并执行程序集中的方法 你可以看看以下文章 http msdn microsoft com en us library ms173139 aspx在 MSDN 上
  • F#,在不使用临时变量的情况下通过管道转发匹配情况

    我想在不使用临时变量或 lambda 的情况下将变量通过管道转发到匹配情况 想法 let temp x gt Function1 gt Function2 Many functions later gt FunctionN let resu
  • 在 Gradle 中定义不依赖的任务顺序?

    Question 当两个任务都被执行时 我能否以某种方式确保一个任务将在另一个任务之前 之后执行 我don t想要在它们之间添加始终存在的依赖关系 背景 我有两项任务 一项任务启动服务器 另一项任务对其运行测试 启动该服务器的任务在一个新进
  • 以编程方式快速向工具栏添加按钮

    我很难快速地向工具栏添加一个按钮 下面你可以看到我想要的工具栏的图像 不幸的是 即使我在故事板文件中设计了它 它也不会显示在将工具栏设置为可见 我设计的方式有两个项目 第一个是flexable space元素 第二个是add元素 它看起来像
  • HttpServletRequest#getRemoteAddr() 返回 NULL

    为什么HttpServletRequest getRemoteAddr http docs oracle com javaee 6 api javax servlet ServletRequest html getRemoteAddr 28
  • 大矩阵计算

    我用 C 编写了一个简单的代码 然后在 linux ubuntu 11 04 上用 g 编译它 没有收到任何错误 但是当我运行可执行文件时 收到此错误 分段错误 我知道我的代码没有问题 并且这个错误与编译器有关 有人可以帮助我吗 我的代码是
  • RTMP:有这样的linux命令行工具吗?

    我到处寻找一个可以让我下载 rtmp 流的 Linux 实用程序 不是 flv 视频而是 MP3 流 我想要下载的流的位置就是这种格式 rtmp live site com loc 45 std fc74a6b7f79c70a5f60 mp
  • 如何在 bazel 中指定 cc_library 的输出工件?

    我想将 foo c 构建为库 然后在生成的 so上执行 readelf 而不是 a 我如何在bazel中编写它 以下 BUILD bazel 文件不起作用 cc library name foo srcs foo c genrule nam
  • 8 拼图有多少种可能的状态?

    经典的 8 块拼图属于滑块家族 我的书 人工智能 一种现代方法 作者 斯图尔特 拉塞尔 Stuart Russell 和彼得 诺维格 Peter Norwig 说 8 个难题9 2可能的状态 但为什么 2 你怎么得到这个 9 是拼图的可能配
  • 从 vb.net 执行 python 脚本

    如何从 VB NET 代码中执行 python 脚本 我想使用 VB NET 为我的 python 脚本构建 GUI 这是为了能够为脚本用户创建 GUI 我找到了这个例子 Shell c Program Files python 266 p
  • Karma 无法加载 webpack

    我收到此错误 16 07 2015 13 03 52 741 WARN preprocess Can not load webpack Error Can not resolve circular dependency Resolving
  • 用于拨打电话的 Web API [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有可以打电话的API进行电话交谈在网络中 也许基于 Flash 例如 Skype 但无需安装软件
  • 在 PHP 中何时使用类与函数

    灯泡还没有亮起来 我真的很喜欢一个易于理解的解释 说明在 php 中使用类比仅使用函数的优势 这是我现在的想法的一个简单例子 我想知道一个类是否更有效 假设我有一个用 php 构建的迷你日历小部件 我正在考虑调用该函数miniCal arr
  • 无法从 WSL2 docker 容器连接到 WSL2 本地主机服务器

    我正在运行一个简单的网络服务器https 0 0 0 0 4000 https 0 0 0 0 4000 也可以作为https local phx cd shoeping at 4000 https local phx cd shoeppi