【问题标题】:.NET Core 3.0 Docker Container Won't Connect to SQL Server.NET Core 3.0 Docker 容器不会连接到 SQL Server
【发布时间】:2021-04-15 19:31:54
【问题描述】:

我们已将部分 .NET Core 2.2 应用程序升级到 .NET Core 3.0。升级后,我们在 Docker 容器中运行的应用程序无法连接到在我们域网络中的独立计算机上运行的 SQL Server 2016。查看数据包跟踪,我们看到连接在登录前握手时挂起,并最终超时。切换回 .NET Core 2.2 可以立即解决问题,并且我们的容器可以再次连接到我们的数据库。

我们显然已经验证不存在 DNS 问题,因为这些容器是在 .NET Core 2.2 的生产环境中运行的。 .NET Core 3.0 破坏了它们,因为它们无法通过网络连接到 SQL Server,因此我们现在回滚到 2.2 并终止升级,直到我们可以确定为什么 .NET Core 2.2 容器连接到我们的 SQL Server 而 .NET Core 3.0容器没有。

我们还从头开始创建了新的 .NET Core 3.0 项目来测试连接。结果是一样的:在预登录到 SQL Server 期间容器超时。将项目改回 .NET Core 2.2,同时将 EF Core 改回 2.2.6,问题立即得到解决。

由于我们使用 EF Core 进行数据访问,我们也尝试将 EF Core 保留为 2.2.6,但将项目升级到 .NET Core 3.0,但连接仍然超时。

如果我们不添加 Docker 支持并将应用程序作为控制台或 Web 应用程序(未容器化)运行,那么 .NET Core 3.0 就没有问题。只有当我们将它们容器化时,.NET Core 3.0 应用程序才会无法连接到 SQL Server。

根据 Dan 在下面 cmets 中的建议,我使用手写 SQL 和 DataReader 将测试项目中的数据访问更改为 Microsoft.Data.SqlClient。然后,我为 .net core 3.0 重新创建了 Dockerfile,并验证是否引用了正确的容器映像。相同的行为:在与 SQL Server 的 PreLogin 握手时挂起。切换到 .net core 2.2 并能够从 SQL Server 连接和读取数据。

【问题讨论】:

  • 我没有答案,但我假设您使用的是System.Data.SqlClient?如果是这样,我很好奇您是否对Microsoft.Data.SqlClient 有同样的问题。也许您可以使用测试容器尝试一下。
  • 很好的建议,但不幸的是它在测试容器中的行为完全相同:适用于 .net core 2.2 但不适用于 .net core 3.0。我会添加到帖子中。不过谢谢!
  • @no1 您如何从 dotnet 核心容器化应用程序独立连接到 ms sql?

标签: sql-server docker .net-core-3.0


【解决方案1】:

这似乎是由于 Linux 映像使用的 TLS 版本造成的。在 GitHub 的 .NET Core 团队的帮助下,我们将 Dockerfile 中的图像从 buster-slim 更改为 bionic。

FROM mcr.microsoft.com/dotnet/core/aspnet:3.0-bionic AS base
WORKDIR /app
EXPOSE 80

FROM mcr.microsoft.com/dotnet/core/sdk:3.0-bionic AS build

https://github.com/dotnet/SqlClient/issues/222

【讨论】:

  • 我花了将近两天的时间研究如何解决问题,但没有成功。这是有效的解决方案。
  • 花了 2 天的时间才找到问题和答案。谢谢!
  • 我在使用 aspnetcore3.1 连接到远程 azure sql dB 时遇到问题。尝试了此修复程序,但没有成功。
  • 同样的问题发生在 .net core 3.1 中。也用同样的办法解决了。
  • 花了1天半的时间。
【解决方案2】:

对于某些在本地使用 SQL Server 的开发人员来说,更改为 -bionic 可能还不够。

对于在本地使用 SQL Server (localhost) 的人,将连接字符串 Data Source 从 localhost 更改为指定的 IP 可能会解决问题。

"ConnectionStrings": {"myDb1": "Data Source=DESKTOP-MGSE697;Initial Catalog=master;User ID=sa;Password=xxx"}

"ConnectionStrings": {"myDb1": "Data Source=xxx.xxx.xxx.xxx,1433;Initial Catalog=master;User ID=sa;Password=123456"}

在大多数情况下,SQL Server 配置管理器的 TCP\IP 协议尚未启用。在“Computer Management”中更改它们 => SQL Server Config Manager => Protocols for MSSQLSERVER(在我的情况下)。

Screenshot of Computer Management

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-02
    • 2019-12-02
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 2020-01-11
    • 1970-01-01
    • 2019-05-29
    相关资源
    最近更新 更多