首页 文章

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

提问于
浏览
1

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

  • 1

    那对我有用的是:

    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容器处理 .

    EDIT:

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

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

    extra_hosts:
    - "localhost:192.168.65.2"
    

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

  • 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和密码中的硬编码;

    用户ID = sa;密码= SuperSecurePassword;

    如果我没有这样做,在某些SQL Server配置上我会收到一个不寻常的错误(不能完全记住细节!)

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

    “服务器= 192.168.X.X,1433;数据库= MyDatabase的;用户ID = SA;密码= SuperSecurePassword; MultipleActiveResultSets =真”

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

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

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

    为旧线程的复活道歉,但是这个问题似乎仍然存在,并且考虑到需要完成的事情很少,可用的信息对于如何解决这个问题有点不完整 .

  • 4

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

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

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

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

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

相关问题