我有一个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操作,因此我不确定这是问题所在。
答案 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,那就足够了。但是我的防火墙已被公司网络禁用,并且该容器正在使用专用网络(已启用防火墙)。关闭专用网络的防火墙可以使连接成功。
哇!