无法从docker支持的asp.net核心项目连接到sql server

时间:2018-01-08 07:25:36

标签: asp.net docker asp.net-core sql-server-2014-express

我有一个ASP.NET Core 2.2项目,我打开了docker支持。只要不需要数据库连接,项目就可以正常运行。例如登录。当我输入用户凭据时,我收到如下错误。

  

处理请求时发生未处理的异常。   Win32Exception:连接尝试失败,因为已连接   一段时间后,党没有正确回应,或已确立   连接失败,因为连接的主机无法响应

     

未知位置SqlException:与网络相关或特定于实例的   建立与SQL Server的连接时发生错误。该   服务器未找到或无法访问。验证该实例   名称是正确的,并且SQL Server配置为允许远程   连接。 (提供者:TCP提供者,错误:0 - 连接尝试   失败,因为关联方在a之后没有正确回应   一段时间,或建立的连接失败,因为连接   主持人没有回复。)

     

System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity   identity,SqlConnectionString connectionOptions,object providerInfo,   bool redirectedUserInstance,SqlConnectionString   userConnectionOptions,SessionData reconnectSessionData,bool   applyTransientFaultHandling)InvalidOperationException:异常   已经提出可能是由于短暂的失败。如果你是   考虑使用连接到SQL Azure数据库   SqlAzureExecutionStrategy。

     

Microsoft.EntityFrameworkCore.Storage.Internal.SqlServerExecutionStrategy + d__7.MoveNext()

以前在我的sql server配置管理器中未启用TCP / IP时错误是不同的。(不记得错误) 我按照链接https://jack-vanlightly.com/blog/2017/9/24/how-to-connect-to-your-local-sql-server-from-inside-docker中提到的步骤来解决该问题。

我也启用了TCP / IP和命名管道。我也可以使用SQL Management Studio中的IP进行连接。

当前连接字符串:

"ConnectionStrings": {
    "DefaultConnection": "Server=xxx.xx.xx.x,1433;Database=TestDB;User ID=username;Password=pwd;Trusted_Connection=True;MultipleActiveResultSets=true"
  },

如果我错过任何一步,请告诉我。我想从我的docker项目连接到本地sql

4 个答案:

答案 0 :(得分:4)

所以对我有用的是:

public static string DockerHostMachineIpAddress => Dns.GetHostAddresses(new Uri("http://docker.for.win.localhost").Host)[0].ToString();

docker.for.win.localhost是docker内部dns将解析为localhost的地址(不是docker内的localhost而是托管机器)。上面的代码为你提供了localhost的ip地址,你可以像这样创建连接字符串:

$"Server={DockerHostMachineIpAddress}\\SQL2017;Database=YourDB;User Id=Admin;Password=123;"

如果您使用的是命名的sql server实例,那么这将有效 - 将SQL2017替换为具有正确用户的ur实例名和crediatials。

无论其! 对于迁移和更新数据库localhost工作正常。可能是因为它没有从docker容器处理。

修改

第二种解决方案有点清洁,但你需要一个支持docker-compose的项目。

在docker-compose.yml文件中,您的服务定义在图像属性定义下面添加:

extra_hosts:
- "localhost:192.168.65.2"

您仍然需要知道您必须为其添加别名的IP地址(您可以通过使用原始答案找到),但是一旦您知道它就会更加干净。我在这个IP上工作的超过5台不同的机器是正确的。

答案 1 :(得分:2)

这花了我一些时间来解决,有许多小问题可能是错误的,这使它感到沮丧。由于自动生成的.net核心Web应用程序Visual Studio 2017项目无法直接使用,因此这可能会更加令人沮丧。第一次接触Docker时没有这种经验。

我最初也有一个错误的假设,即Docker映像将随SQL Server一起提供在容器内,事实并非如此,它试图访问必须预先安装在主机上的数据库服务器。

要遵循的步骤(已针对Windows docker映像(而非Linux)进行了测试;

1)通过运行命令提示符并键入IPCONFIG,获取主机的IP地址

2)将appsettings.json文件中的数据库连接字符串设置为此IP地址,后跟SQL Server端口号,即;

192.168.X.X,1433

3)将连接字符串设置为不使用Trusted_Connection(将其从连接字符串中删除)和用户ID和密码中的硬代码;

User Id = sa; Password = SuperSecurePassword;

如果我不这样做,在某些SQL Server配置上,我将收到一个异常错误(无法完全记住具体细节!)

连接字符串显示看起来像这样;

“ Server = 192.168.X.X,1433; Database = MyDatabase; User Id = sa; Password = SuperSecurePassword; MultipleActiveResultSets = true”

4)现在,您需要在主机上打开Windows防火墙,并为TCP端口1433添加新的入站连接规则。

5)完成所有操作后,仍然无法正常工作,请尝试重新启动;我挣扎了很长时间,不得不重新启动,这使它变得栩栩如生。我不确定Docker是否已正确初始化,但这主要是猜测!我真的不是很想说重新启动是解决问题的方法,但这并不是真正的答案,但是在某些情况下,它可以解决问题。

编辑,最后一件事,以管理员模式运行Visual Studio(右键单击图标,“以管理员身份运行”)也有帮助。

为旧线程的复活表示歉意,但这个问题似乎仍然存在,考虑到需要做的事情很少,可用的信息在解决此问题上有些修补。

答案 2 :(得分:1)

我遇到了同样的问题,采用了与您提到的网站相同的方法。如果您的网络具有标准配置,它应该像这样工作。

只需禁用公共网络的防火墙即可。

我的问题很简单,Windows似乎将Docker创建的网络分类为公共网络,因此防火墙阻止它,就像这个一样:

Can't connect to SQL Server express from .net core app running on docker

它没有标记为答案,而是在问题中进行了编辑。

答案 3 :(得分:0)

我遇到了同样的问题,并遵循了Phil所提到的所有步骤,但仍然无法解决。 最后,除了指定答案中的步骤外,我还必须按照以下步骤为SQL协议启用SQL Server。

1. Open SQL Server Configuration Manager
2. Select "SQL Server Network Configuration" > "Protocols for MSSQLSERVER"
3. Edit "TCP/IP" properties, and change "Enabled" to "Yes"