如何从Windows Docker容器中的.NET应用程序连接到主机上运行的SQL Server

时间:2019-01-29 14:44:19

标签: .net sql-server windows docker

我有一个Windows docker容器和一个简单的测试应用,试图与主机上运行的SQL Server连接,但无法连接。

我能够使用“ ping -4 hostmachinename”从容器ping主机,但是SqlConnection Open方法失败。

要测试,我运行以下命令:

docker build --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 Server的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称正确,并且已将SQL Server配置为允许远程连接。 (提供者:TCP提供程序,错误:0-未知此类主机。)

使用计算机名称时,我得到:错误:建立与SQL Server的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称正确,并且已将SQL Server配置为允许远程连接。 (提供者:TCP提供程序,错误:0-等待操作超时。)

我为--net尝试了各种选项,但是由于我能够使用默认网络设置对主机进行ping操作,因此我不确定这是问题所在。

2 个答案:

答案 0 :(得分:0)

您需要在主机和Docker容器之间建立网络连接。

也尝试从未运行SQL Server服务的容器中公开端口1433。这是行不通的。

您还需要检查您的SQL Server是否配置为允许来自SQL Server配置管理器的TCP / IP连接。

查看此帖子是否有助于您解决问题: How to access host port from docker container

和这篇文章 https://nickjanetakis.com/blog/docker-tip-35-connect-to-a-database-running-on-your-docker-host

答案 1 :(得分:0)

好的,我是个白痴。我以为既然可以从网络上的另一台计算机访问我的SQL Server,那就足够了。但是我的防火墙已被公司网络禁用,并且该容器正在使用专用网络(已启用防火墙)。关闭专用网络的防火墙可以使连接成功。

哇!