从 Windows 10 连接 WSL2 SQL Server 本地主机实例

Kid*_*per 6 sql-server containers docker wsl-2

我已经设置了 WSL2 Ubuntu。现在我正在使用 Docker 在 1401 端口上运行本地 SQL Server 实例。

集装箱港口:

0.0.0.0:1401->1433/tcp

我想从 SSMS 连接此实例,但收到以下错误:

服务器名称:localhost,1401 错误:

无法连接到本地主机,1401。

建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误。

服务器未找到或无法访问。验证实例名称是否正确以及 SQL Server 是否配置为允许远程连接。

(提供程序:TCP 提供程序,错误:0 - 等待操作超时。)(Microsoft SQL Server,错误:258)

[解决方案] 我可以通过WSL2 IP连接它。我在 WSL2 中运行“hostname -I”命令并在 SSMS 中使用相同的 IP。而且,我能够建立联系

Not*_*1ds 6

第一个问题——Windows 中是否有运行/连接的 VPN?如果是这样,请忽略其余部分并首先怀疑这一点。确保 VPN 未运行,停止 Docker,发出 a wsl --shutdown,重新启动并重试。

假设这不是问题...

通常,WSL2 提供称为“本地主机转发”的功能,该功能允许 Windows 上的服务/应用程序使用localhost. 它本质上会获取任何未定向到 Windows 下绑定端口的本地主机流量,并将其转发到 WSL2 的 Hyper-V 虚拟网络。

所有 WSL2 实例(包括 Docker 实例)共享相同的 WSL2 网络接口,因为它们都在同一虚拟机/内核中运行。

因此,您在尝试从 SSMS 连接时似乎做了正确的事情localhost

但是......有时本地主机转发会中断。有两种常见(相关)情况可能会导致这种情况(或许还有其他情况):

  • Windows主机休眠
  • 在 Power Manager 中启用 Windows 快速启动

首先检查以确保您可以从WSL2访问 1401 :

nc -zv localhost 1401
Run Code Online (Sandbox Code Playgroud)

^^^ 假设已安装 netcat,这是 WSL2 Ubuntu 发行版中默认安装的。对于其他发行版,请安装它或通过其他方法检查连接。

如果不成功,那么我怀疑 SQL Server 中存在一些配置问题。

如果成功,则在 Windows 主机的 PowerShell 中运行相同的测试:

Test-NetConnection -ComputerName "localhost" -Port 1401
Run Code Online (Sandbox Code Playgroud)

如果不成功,那么我怀疑本地主机转发问题。

旁注:我假设您正在运行 Docker Desktop,但如果您只是在 WSL2 实例中运行 Docker Engine,那没问题。只需忽略下面的 Docker Desktop 说明即可。

  • 首先,检查您/etc/wsl.conf正在运行的 WSL2 实例中是否有提及禁用localhostForwarding. 我假设不会,因为这不是默认值。但是,如果您碰巧这样做,请确保将它们设置为true
  • 停止所有 WSL2 服务、实例、shell、应用程序等(包括 Docker Desktop)
  • 来自 PowerShell:
    wsl --shutdown
    
    Run Code Online (Sandbox Code Playgroud)
  • 然后重新启动 Docker Desktop 和/或您的容器并重试