在 docker 容器中连接到 SQL Server 时出错

我有一个在 Windows Docker 容器中运行的 ASP.NET Core WebAPI。我在从应用程序内部连接到本地 SQL 实例时遇到问题。

这是错误消息:

(0x80131904):建立与 SQL Server 的连接时发生了与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确以及 SQL Server 是否配置为允许远程连接。(提供程序:命名管道提供程序,错误:40 - 无法打开与 SQL Server 的连接)---> System.ComponentModel.Win32Exception (53): 找不到网络路径

在 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。两者都有完全相同的错误。

  • 我可以ping使用其主机名或本地 IP 从容器内部获取 SQL 实例。

  • 当我用连接字符串中的本地 IP 地址替换实例名称时,一切正常。

  • 如果我在 .NET CLI 中运行应用程序(不使用 Docker),一切正常

  • 我尝试访问的 SQL 实例未托管在 Docker 上。它托管在同一本地网络上的另一台 Windows 服务器上。

  • 我可以DataSource=MyAzureServer.database.windows.net毫无问题地使用 Azure 上托管的其他 SQL 实例。


阿波罗的战车
浏览 236回答 3
3回答

慕桂英546537

根据我在评论中的建议,如果服务器名称不是完全限定的域名 (FQDN),则在将服务器解析为 IP 时可能会出现问题。尝试将服务器名称调整为 FQDN,希望这样可以解决问题。如果做不到这一点,请查看诸如这个链接以从 SQL Server 的角度计算名称解析,您将获得一些关于如何解决此类问题的其他想法。

qq_遁去的一_1

检查这个 docker-composer.yaml,网络和别名部分很重要,上面的设置可以用 docker 命令而不是 yaml 生成。    version: '3.4'    services:      some.api:        image: ${DOCKER_REGISTRY-}someapi        container_name: some.api        build:          context: .          dockerfile: /Dockerfile        ports:          - "40080:80"          - "44443:443"        networks:        - database      some.db:        image: microsoft/mssql-server-linux:2017-latest        container_name: mssql1        networks:          database:            aliases:              - mssql1        environment:          - SA_PASSWORD=Pass@word          - ACCEPT_EULA=Y        ports:          - "5454:1433"    networks:  database:网络被定义为从另一个访问容器。别名用于命名资源,对于上面的代码片段,连接字符串是:Server=mssql1;Database=whatever_is_need;User Id=sa;Password=Pass@word;

小唯快跑啊

我和你有同样的问题。连接字符串中的服务器名称和容器名称应该相同。
打开App,查看更多内容
随时随地看视频慕课网APP