无法从 docker 支持的 asp.net 核心项目连接到 sql 服务器
Can not connect to sql server from docker supported asp.net core project
我有一个 ASP.NET Core 2.2 项目,我为其启用了 docker 支持。只要不需要数据库连接,该项目就可以正常运行。例如登录。当我输入用户凭据时,出现如下错误。
An unhandled exception occurred while processing the request.
Win32Exception: A connection attempt failed because the connected
party did not properly respond after a period of time, or established
connection failed because connected host has failed to respond
Unknown location SqlException: A network-related or instance-specific
error occurred while establishing a connection to SQL Server. The
server was not found or was not accessible. Verify that the instance
name is correct and that SQL Server is configured to allow remote
connections. (provider: TCP Provider, error: 0 - A connection attempt
failed because the connected party did not properly respond after a
period of time, or established connection failed because connected
host has failed to respond.)
System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity
identity, SqlConnectionString connectionOptions, object providerInfo,
bool redirectedUserInstance, SqlConnectionString
userConnectionOptions, SessionData reconnectSessionData, bool
applyTransientFaultHandling) InvalidOperationException: An exception
has been raised that is likely due to a transient failure. If you are
connecting to a SQL Azure database consider using
SqlAzureExecutionStrategy.
Microsoft.EntityFrameworkCore.Storage.Internal.SqlServerExecutionStrategy+d__7.MoveNext()
以前在我的 sql 服务器配置管理器中未启用 TCP/IP 时错误是不同的。(不记得错误)
我按照 link 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
我遇到了同样的问题,采用了与您提到的网站上相同的方法。如果你有标准配置的网络,它应该是这样工作的。
只需为您的 public 网络禁用防火墙。
我的问题很简单,windows 似乎将 Docker 创建的网络归类为 public 网络,因此防火墙阻止了它,与此相同:
它没有被标记为答案,而是在问题中被编辑了。
所以对我有用的是:
public static string DockerHostMachineIpAddress => Dns.GetHostAddresses(new Uri("http://docker.for.win.localhost").Host)[0].ToString();
docker.for.win.localhost 是一个地址,docker 的内部 dns 将解析为本地主机(不是 docker 内的本地主机,而是主机)。上面的代码为您提供了本地主机的 IP 地址,您可以像这样创建连接字符串:
$"Server={DockerHostMachineIpAddress}\SQL2017;Database=YourDB;User Id=Admin;Password=123;"
如果您使用的是已命名的 sql 服务器实例,这将有效 - 将 SQL2017 替换为您的实例名称,并将凭据替换为正确的用户。
然而!
对于迁移和 update-database localhost 工作正常。可能是因为它不是从 docker 容器处理的。
编辑:
第二种解决方案更简洁,但您需要有一个支持 docker-compose 的项目。
在 docker-compose.yml 文件中您的服务定义如下图 属性 定义添加:
extra_hosts:
- "localhost:192.168.65.2"
您仍然需要知道您必须为其添加别名的 IP 地址(您可以使用原始答案找到该地址),但是一旦您知道它,它就会更干净一些。我在超过 5 台不同的机器上使用这个 IP 是正确的。
这花了我一些时间来解决,有一些小问题可能是错误的,这让人很沮丧。这可能会变得更加令人沮丧,因为自动生成的 .net 核心 Web 应用程序 visual studio 2017 项目无法直接使用。第一次接触 Docker 就拥有这种体验并不理想。
我最初也有错误的假设 docker 图像会在容器内带有 SQL 服务器,事实并非如此,它正在尝试访问必须预先访问的数据库服务器-安装在主机上。
要遵循的步骤(测试了 windows docker 图像,而不是 linux);
1) 通过 运行 命令提示符并键入 IPCONFIG
获取主机的 IP 地址
2) 将你appsettings.json文件中的数据库连接字符串设置为这个IP地址,后跟SQL服务器端口号,即;
192.168.X.X,1433
3) 将连接字符串设置为不使用 Trusted_Connection(从连接字符串中删除)和用户 ID 和密码中的硬编码;
用户 ID=sa;密码=SuperSecurePassword;
如果我不这样做,在某些 SQL 服务器配置上我会遇到异常错误(不太记得具体细节了!)
连接字符串显示如下所示;
"Server=192.168.X.X,1433;Database=MyDatabase;User Id=sa;Password=SuperSecurePassword;MultipleActiveResultSets=true"
4) 现在您需要在主机上打开 windows 防火墙,并为 TCP 端口 1433 添加新的入站连接规则。
5) 都这样还是不行,重启试试;折腾了半天,只好重启,才活过来;我不确定 Docker 是否已正确初始化,但这主要是猜测!我真的不想说重启是解决问题的方法,它不是真正的答案,但在某些情况下它可以解决问题。
编辑,最后一件事,运行 visual studio 在管理员模式下(右键单击图标,"run as administrator")也有帮助。
对于旧线程的复活表示歉意,但这个问题似乎仍然存在,并且考虑到需要完成的事情很少,可用的信息关于如何解决这个问题有点零散。
我 运行 遇到了同样的问题,并按照 提到的所有步骤进行了操作,但我仍然无法解决这个问题。
最后,除了指定答案中的步骤外,我还必须按照以下步骤为 TCP 协议启用 SQL 服务器。
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"
我有一个 ASP.NET Core 2.2 项目,我为其启用了 docker 支持。只要不需要数据库连接,该项目就可以正常运行。例如登录。当我输入用户凭据时,出现如下错误。
An unhandled exception occurred while processing the request. Win32Exception: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond
Unknown location SqlException: A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: TCP Provider, error: 0 - A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.)
System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, object providerInfo, bool redirectedUserInstance, SqlConnectionString userConnectionOptions, SessionData reconnectSessionData, bool applyTransientFaultHandling) InvalidOperationException: An exception has been raised that is likely due to a transient failure. If you are connecting to a SQL Azure database consider using SqlAzureExecutionStrategy.
Microsoft.EntityFrameworkCore.Storage.Internal.SqlServerExecutionStrategy+d__7.MoveNext()
以前在我的 sql 服务器配置管理器中未启用 TCP/IP 时错误是不同的。(不记得错误) 我按照 link 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我遇到了同样的问题,采用了与您提到的网站上相同的方法。如果你有标准配置的网络,它应该是这样工作的。
只需为您的 public 网络禁用防火墙。
我的问题很简单,windows 似乎将 Docker 创建的网络归类为 public 网络,因此防火墙阻止了它,与此相同:
它没有被标记为答案,而是在问题中被编辑了。
所以对我有用的是:
public static string DockerHostMachineIpAddress => Dns.GetHostAddresses(new Uri("http://docker.for.win.localhost").Host)[0].ToString();
docker.for.win.localhost 是一个地址,docker 的内部 dns 将解析为本地主机(不是 docker 内的本地主机,而是主机)。上面的代码为您提供了本地主机的 IP 地址,您可以像这样创建连接字符串:
$"Server={DockerHostMachineIpAddress}\SQL2017;Database=YourDB;User Id=Admin;Password=123;"
如果您使用的是已命名的 sql 服务器实例,这将有效 - 将 SQL2017 替换为您的实例名称,并将凭据替换为正确的用户。
然而! 对于迁移和 update-database localhost 工作正常。可能是因为它不是从 docker 容器处理的。
编辑:
第二种解决方案更简洁,但您需要有一个支持 docker-compose 的项目。
在 docker-compose.yml 文件中您的服务定义如下图 属性 定义添加:
extra_hosts:
- "localhost:192.168.65.2"
您仍然需要知道您必须为其添加别名的 IP 地址(您可以使用原始答案找到该地址),但是一旦您知道它,它就会更干净一些。我在超过 5 台不同的机器上使用这个 IP 是正确的。
这花了我一些时间来解决,有一些小问题可能是错误的,这让人很沮丧。这可能会变得更加令人沮丧,因为自动生成的 .net 核心 Web 应用程序 visual studio 2017 项目无法直接使用。第一次接触 Docker 就拥有这种体验并不理想。
我最初也有错误的假设 docker 图像会在容器内带有 SQL 服务器,事实并非如此,它正在尝试访问必须预先访问的数据库服务器-安装在主机上。
要遵循的步骤(测试了 windows docker 图像,而不是 linux);
1) 通过 运行 命令提示符并键入 IPCONFIG
获取主机的 IP 地址2) 将你appsettings.json文件中的数据库连接字符串设置为这个IP地址,后跟SQL服务器端口号,即;
192.168.X.X,1433
3) 将连接字符串设置为不使用 Trusted_Connection(从连接字符串中删除)和用户 ID 和密码中的硬编码;
用户 ID=sa;密码=SuperSecurePassword;
如果我不这样做,在某些 SQL 服务器配置上我会遇到异常错误(不太记得具体细节了!)
连接字符串显示如下所示;
"Server=192.168.X.X,1433;Database=MyDatabase;User Id=sa;Password=SuperSecurePassword;MultipleActiveResultSets=true"
4) 现在您需要在主机上打开 windows 防火墙,并为 TCP 端口 1433 添加新的入站连接规则。
5) 都这样还是不行,重启试试;折腾了半天,只好重启,才活过来;我不确定 Docker 是否已正确初始化,但这主要是猜测!我真的不想说重启是解决问题的方法,它不是真正的答案,但在某些情况下它可以解决问题。
编辑,最后一件事,运行 visual studio 在管理员模式下(右键单击图标,"run as administrator")也有帮助。
对于旧线程的复活表示歉意,但这个问题似乎仍然存在,并且考虑到需要完成的事情很少,可用的信息关于如何解决这个问题有点零散。
我 运行 遇到了同样的问题,并按照
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"