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

时间:2019-04-01 20:45:14

标签: c# docker asp.net-core .net-core docker-windows

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

这是错误消息:

  

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

我找到了this issue on github,但这并不完全适合我的情况。

我可以通过将实例名称替换为服务器本地IP地址来使一切正常工作,

service cloud.firestore {
   match /databases/{database}/documents {
     match /teachers/{teacher}/classes/{class} {

        function isHeadMaster() {
          return get(/databases/$(database)/documents/headmasters/$(request.auth.uid)).data.isHM;
        }

        // HM can read, write classes
        allow read, write: if isHeadMaster == true;

     }
   }
}

这是怎么回事?似乎.NET无法解析域计算机的主机名。


其他详细信息

  • 使用.Net Core 2.2
  • 在Windows上使用Docker Windows容器
  • 尝试在"ConnectionString_ThrowingError": "Data Source=MySqlInstance; (...)" "ConnectionString_WorkingFine": "Data Source=192.168.0.123; (...)" Windows 10上托管。两者都有完全相同的错误。
  • 我可以使用容器的主机名或本地IP从容器内部Windows Server 2019来。
  • 当我用连接字符串中的本地IP地址替换实例名称时,一切正常。
  • 如果我在.NET CLI(不使用Docker)中运行应用程序,则一切正常
  • 我尝试访问的SQL实例未托管在Docker上。它托管在同一局域网中的另一台Windows Server上。
  • 我可以使用ping访问Azure上托管的其他SQL实例,而不会出现任何问题。

3 个答案:

答案 0 :(得分:1)

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

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

如果失败,请查看诸如this one之类的链接,以从SQL Server的角度确定名称解析,然后您将获得其他一些有关如何解决此类问题的想法。

答案 1 :(得分:0)

检查此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;数据库= whatever_is_need;用户ID = sa;密码= Pass @ word;

答案 2 :(得分:-1)

我不了解.NET Core,但是如果您.NET Core在像Web应用程序这样的浏览器实例中运行,我可以给您一些提示,因为容器仅存在于主机中,因此浏览器无法使用“ MySqlInstance”解析您的MYSQL服务器机。检查。.可能就是使用IP起作用的原因。