我有一个ASP.NET Core 2.2项目,我打开了docker支持 . 只要不需要数据库连接,项目就可以正常运行 . 例如登录 . 当我输入用户凭据时,我收到如下错误 .
处理请求时发生未处理的异常 . Win32Exception:连接尝试失败,因为连接方在一段时间后没有正确响应,或者 Build 的连接失败,因为连接的主机未能响应未知位置SqlException: Build 连接时发生网络相关或特定于实例的错误SQL Server . 服务器未找到或无法访问 . 验证实例名称是否正确,以及SQL Server是否配置为允许远程连接 . (提供程序:TCP提供程序,错误:0 - 连接尝试失败,因为连接方在一段时间后没有正确响应,或者 Build 的连接失败,因为连接的主机无法响应 . )System.Data.SqlClient.SqlInternalConnectionTds .. ctor(DbConnectionPoolIdentity标识,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
3 回答
那对我有用的是:
docker.for.win.localhost是docker内部dns将解析为localhost的地址(不是docker内的localhost,而是托管机器) . 上面的代码为你提供了localhost的ip地址,你可以像这样创建连接字符串:
如果您使用的是命名的sql server实例,那么这将有效 - 将SQL2017替换为具有正确用户的ur实例名称和crediatials .
然而!对于迁移和更新数据库localhost工作正常 . 可能是因为它没有从docker容器处理 .
EDIT:
第二个解决方案有点清洁但你需要一个支持docker-compose的项目 .
在docker-compose.yml文件中,您的服务定义在图像属性定义下面添加:
您仍然必须知道您必须为其添加别名的IP地址(您可以通过使用原始答案找到),但是一旦您知道它就会更加干净 . 我在这个IP上工作的超过5台不同的机器是正确的 .
这花了我一些时间来解决,有一些小问题可能是错误的,这使它令人沮丧 . 由于自动生成的.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和密码中的硬编码;
用户ID = sa;密码= SuperSecurePassword;
如果我没有这样做,在某些SQL Server配置上我会收到一个不寻常的错误(不能完全记住细节!)
连接字符串显示看起来像这样;
“服务器= 192.168.X.X,1433;数据库= MyDatabase的;用户ID = SA;密码= SuperSecurePassword; MultipleActiveResultSets =真”
4)现在在主机上你需要打开Windows防火墙,并为TCP端口1433添加新的入站连接规则 .
5)完成所有这些后,它仍然无效,请尝试重新启动;我挣扎了很长时间,不得不重新启动,这使它成为现实;我不确定Docker是否已正确初始化,但这主要是猜测!我真的不想说重新启动是解决问题的方法,它不是真正的答案,但在某些情况下它可以解决问题 .
编辑,最后一件事,以管理员模式运行visual studio(右键单击图标,“以管理员身份运行”)也有帮助 .
为旧线程的复活道歉,但是这个问题似乎仍然存在,并且考虑到需要完成的事情很少,可用的信息对于如何解决这个问题有点不完整 .
我遇到了同样的问题,采用了与您提到的网站相同的方法 . 如果您的网络具有标准配置,它应该像这样工作 .
只需禁用公共网络的防火墙即可 .
我的问题很简单,Windows似乎将Docker创建的网络分类为公共网络,因此防火墙阻止了它,就像这个一样:
Can't connect to SQL Server express from .net core app running on docker
它没有标记为答案,而是在问题中进行了编辑 .