【问题标题】:Error when connecting to SQL Server in docker container连接到 docker 容器中的 SQL Server 时出错
【发布时间】: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 10Windows Server 2019 上托管。两者都有完全相同的错误。
  • 我可以使用其主机名或本地 IP 从容器内部 ping SQL 实例。
  • 当我将实例名称替换为连接字符串中的本地 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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    检查这个 docker-composer.yaml,networks 和 alias 部分很重要,上面的设置可以使用 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:
    
    • 网络被定义为从另一个容器访问容器。
    • 别名用于有一个命名资源,对于上面的sn-p,连接字符串是:

    Server=mssql1;Database=whatever_is_need;User Id=sa;Password=Pass@word;

    【讨论】:

    • yaml 看起来被代码 sn-p 修改了,无法正确对齐。
    • 感谢您的回答!我在我的问题中添加了其他信息。但是,由于我的 SQL 实例未托管在 docker 容器上,因此我认为这不适用于我的情况。
    • 我的错,我会尝试为本地主机 ip 提供一个 compose
    猜你喜欢
    • 1970-01-01
    • 2020-09-24
    • 2023-02-02
    • 2019-05-29
    • 2016-12-26
    • 2019-11-19
    • 2022-08-16
    • 2016-11-29
    • 1970-01-01
    相关资源
    最近更新 更多