docker WSL2无法访问在Windows主机上运行的服务

wb1gzix0  于 2023-08-03  发布在  Docker
关注(0)|答案(3)|浏览(506)

我有几个服务在我的windows主机上运行。其中一些可以通过在端口8090、8091中运行的wsl访问。其他港口的人永远挂着。
eror
netstat

0s7z1bwu

0s7z1bwu1#

错误消息connection refused表示此端口上没有服务侦听。确保您的服务使用此端口。在Linux上,您可以使用netstat -apn(作为root用户执行)检查哪些服务侦听哪个端口。在Windows工具上,如https://learn.microsoft.com/en-us/sysinternals/downloads/tcpview显示所有端口和这些端口上列出的服务。

oaxa6hgo

oaxa6hgo2#

重要的是要了解WSL 2运行在虚拟化网络中,该网络在Windows主机上运行的Hyper-V路由器后面进行NAT。这意味着,从WSL 2的Angular 来看,您的Windows主机实际上位于单独的网络上。
因此,通常有三种原因导致无法从WSL 2连接到Windows中运行的服务:

  • 首先,这很可能不是这样的,因为你提到你可以访问一些服务,你需要使用Hyper-V路由器本身的地址来与Windows上的服务通信。该地址可以在以下默认路由中看到:
ip route

字符串
太多的指南提供了一个太复杂的建议,使用类似于:

echo $(ip route list default | awk '{print $3}')


...以获取Windows服务所需的地址。
但是,假设您使用的Windows 10版本已超过其支持终止日期,您应该能够使用mDNS,如my answer here中所述。总结如下:

echo $(hostname).local


不过,我假设您已经在这样做了,因为您提到可以访问一些服务。如果您在WSL 2中使用localhost来尝试与Windows服务进行通信,则这是不可能的。

  • 第二个原因是,由于Windows和WSL 2网络是分开的,您的服务不能只侦听127.0.0.1/localhost。这将允许来自Windows本地主机的连接,但WSL 2连接将失败,因为它们来自另一个地址。确保绑定到0.0.0.0。执行此操作的说明将取决于您正在配置的服务。
  • 最后,您可能遇到防火墙问题。如果我没记错的话,Hyper-V网络默认设置为Public,我还没能在最近的Windows版本中找到更改它的方法。以前,您可以使用Set-NetConnectionProfile,但在最近几个Windows版本中无法使用。

因此,除非为服务配置允许规则,否则防火墙通常会拒绝不受信任的连接。通常,Windows会在第一次从外部访问特定端口时提供一个用于创建永久规则的UI,但是(根据我的经验)很容易错过这个对话框,因为它经常被重新定位在另一个窗口下。在此之后,您必须手动创建规则,无论是通过Windows Defender UI还是从PowerShell使用New-NetFirewallRule

xv8emn3q

xv8emn3q3#

对于Docker Desktop,使用特殊地址host.docker.internal。据我所知,这是为了发展。

相关问题