我有一个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
答案 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"