![](/img/trans.png)
[英]Connect to local SQL Server from .Net 4.8 Console Application Running in Docker Windows container
[英]How do you connect to SQL Server running on the host from a .NET app in a windows docker container
我有一个 Windows docker 容器和一个简单的测试应用程序,它试图与主机上运行的 SQL 服务器连接,但无法连接。
我可以使用“ping -4 hostmachinename”从容器中 ping 主机,但 SqlConnection Open 方法失败。
为了测试我运行这些命令:
docker 构建 --tag=heydocker。 docker 运行 heydocker:latest
# Dockerfile:
FROM microsoft/dotnet-framework
WORKDIR /app
COPY . /app
EXPOSE 1433
CMD ["program.exe"]
这是我的应用程序代码:
// program.cs:
using System;
using System.Data;
using System.Data.Common;
using System.Data.SqlClient;
namespace Test
{
public static class program
{
const string CONNECT = "Data Source=docker.for.win.localhost;Database=MG108RC3_All;User ID=sa;Pwd=password;Network Library=dbmssocn";
public static void Main()
{
Console.WriteLine( "Hello Docker" );
try
{
using ( var con = new SqlConnection( CONNECT ) )
{
con.Open();
Console.WriteLine( "Open SUCCESS" );
}
}
catch ( Exception ex )
{
Console.WriteLine( $"ERROR: {ex.Message}" );
}
}
}
}
我尝试在 Dockerfile 中省略 EXPOSE,并使用 EXPOSE 1433:1433。
我还尝试在连接字符串中使用实际机器名称,以及 host.docker.internal。
使用 docker.for.win.localhost 时出现异常:错误:与 SQL 服务器建立连接时发生网络相关或特定于实例的错误。 服务器未找到或无法访问。 验证实例名称是否正确,并且 SQL 服务器配置为允许远程连接。 (提供者:TCP 提供者,错误:0 - 不知道这样的主机。)
使用机器名称时,我得到:错误:与 SQL 服务器建立连接时发生网络相关或特定于实例的错误。 服务器未找到或无法访问。 验证实例名称是否正确,并且 SQL 服务器配置为允许远程连接。 (提供者:TCP 提供者,错误:0 - 等待操作超时。)
我已经为 --net 尝试了各种选项,但由于我能够使用默认网络设置 ping 我的主机,我不确定这是问题所在。
您需要在主机和Docker容器之间建立网络连接。
另外,您尝试从未运行SQL Server服务的容器中公开端口1433。 这行不通。
您还需要检查您的SQL Server是否配置为允许来自SQL Server配置管理器的TCP / IP连接。
查看这篇文章是否可以帮助您解决问题: 如何从Docker容器访问主机端口
和这篇文章https://nickjanetakis.com/blog/docker-tip-35-connect-to-a-database-running-on-your-docker-host
好,我是个白痴。 我以为既然可以从网络上的另一台计算机访问我的SQL Server,那就足够了。 但是我的防火墙已被公司网络禁用,并且该容器正在使用专用网络(已启用防火墙)。 关闭专用网络的防火墙可以使连接成功。
ew!
同样的问题困扰了我好几天,终于能够按照以下步骤解决它。
在我的例子中,SQL 服务器托管在 Azure 托管实例上,并暴露了一个私有端点。 docker 能够将 Azure 托管实例的 DNS 名称解析到私有 ZA12A3079E14CED46E69B2 地址(如预期)。 But this resolved IP was considered by the docker network/bridge as a locally running application because upon inspecting docker's bridge ( docker network inspect bridge
)The subnet of the bridge was found to be a range of IP addresses where the resolved IP of the SQL server也跌倒。 因此,docker 假定 SQL 服务器托管在同一本地网络中,而不是外部(此处为企业网络)。 就我而言,我正在工作的 Windows VM 已经在企业的专用网络上。
解决方案:
In the docker desktop -> settings -> Docker Engine json file, add a new key value pair "bip": "<local IP address range which is outside of the resolved sql server IP>"
. 重新启动 docker 桌面,问题应该得到解决。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.