繁体   English   中英

如何从 windows Z05B6053C415A2134EAD6 容器中的 .NET 应用程序连接到在主机上运行的 SQL 服务器

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM