【发布时间】:2019-08-23 02:28:39
【问题描述】:
我有一个在 Windows Docker 容器中运行的 ASP.NET Core WebAPI。我无法从应用程序内部连接到本地 SQL 实例。
这是错误信息:
(0x80131904):建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确以及 SQL Server 是否配置为允许远程连接。 (提供者:命名管道提供者,错误:40 - 无法打开与 SQL Server 的连接)---> System.ComponentModel.Win32Exception (53): 找不到网络路径
我找到了this issue on github,但它并不真正适用于我的情况。
我可以通过将实例名称替换为服务器本地 IP 地址来使一切正常工作,如下所示:
"ConnectionString_ThrowingError": "Data Source=MySqlInstance; (...)"
"ConnectionString_WorkingFine": "Data Source=192.168.0.123; (...)"
这里发生了什么? .NET 似乎无法解析域机器主机名。
其他详情
- 使用 .Net Core 2.2
- 在 Windows 上使用 Docker Windows 容器
- 尝试在
Windows 10和Windows Server 2019上托管。两者都有完全相同的错误。 - 我可以使用其主机名或本地 IP 从容器内部
pingSQL 实例。 - 当我将实例名称替换为连接字符串中的本地 IP 地址时,一切正常。
- 如果我在 .NET CLI(不使用 Docker)中运行应用程序,一切正常
- 我尝试访问的 SQL 实例未托管在 Docker 上。它托管在同一本地网络上的另一台 Windows Server 上。
- 我可以毫无问题地使用
DataSource=MyAzureServer.database.windows.net访问 Azure 上托管的其他 SQL 实例。
【问题讨论】:
-
this link 的 DNS 服务部分是否提供任何指导?我猜服务器名称不是从容器内部解析的。我知道你说过你可以从容器中 ping IP,但也许它是 DNS 和可能需要发布端口 (1433) 的某种组合。
-
@MrMoose 不是。容器可以解析主机名。我怀疑还有更深层次的问题在起作用。
-
我知道我在从容器连接到本地计算机上的命名实例时遇到了问题,但对于我的一生,我不记得它是什么。我觉得我必须明确定义与端口的连接,例如
\MyNamedInstance,1433;有点像this link。如果有机会,我今晚会在家里检查一下,如果它看起来有帮助,我会回来报告。 -
对不起@JustinLessard,我的问题是因为我的本地机器上的命名实例默认配置为使用动态端口。我必须调整配置以确保它在 specific port 上侦听,而这不是您所看到的。
-
你有没有得到这个排序。我一直在思考它。我想知道 SQL Server 名称解析是否有什么不同,或者您是否没有使用完全限定的域名,但我从您的更新中看到您是。 This link 有一些有用的东西可以检查名称解析。它不是特定于 docker 的,但可能很有用。如果做不到这一点,我会看看你还能找到什么关于容器网络和你可以利用的 DNS 调试/调查的信息。
标签: c# docker asp.net-core .net-core docker-for-windows