为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
阿波罗的战车 2022-11-21 21:32:41

我有一个在 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 实例。


查看完整描述

3 回答

?
慕桂英546537

TA贡献1562条经验 获得超10个赞

根据我在评论中的建议,如果服务器名称不是完全限定的域名 (FQDN),则在将服务器解析为 IP 时可能会出现问题。

尝试将服务器名称调整为 FQDN,希望这样可以解决问题。

如果做不到这一点,请查看诸如这个链接以从 SQL Server 的角度计算名称解析,您将获得一些关于如何解决此类问题的其他想法。


查看完整回答
反对 回复 2022-11-21
?
qq_遁去的一_1

TA贡献1441条经验 获得超7个赞

检查这个 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;


查看完整回答
反对 回复 2022-11-21
?
小唯快跑啊

TA贡献1589条经验 获得超2个赞

我和你有同样的问题。连接字符串中的服务器名称和容器名称应该相同。



查看完整回答
反对 回复 2022-11-21
  • 3 回答
  • 0 关注
  • 8 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信