一尘不染

无法从Docker上运行的.net核心应用连接到SQL Server Express

docker

我在Windows 10计算机上安装了SQL Server 2016 Express,适用于Windows的docker和IIS。

SQL Server Express配置为在1455端口上侦听。罗斯文(Northwind)示例数据库在那里。

Windows防火墙已禁用。

Ipconfig 显示以下内容:

Ethernet adapter vEthernet (DockerNAT) 2:

   Connection-specific DNS Suffix  . :
   Link-local IPv6 Address . . . . . : fe80::70f1:3323:a7a8:b7a5%21
   IPv4 Address. . . . . . . . . . . : 10.0.75.1
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   Default Gateway . . . . . . . . . :

我在Visual Studio 2017中创建了一个非常简单的.net core 2控制台应用程序:

using System;
using System.Data.SqlClient;
using System.Net.Http;

namespace ConnectSqlServer
{
    class Program
    {
        static void TestHttp()
        {
            using (var client = new HttpClient())
            {
                var response = client.GetAsync("http://10.0.75.1").Result;
                var content = response.Content.ReadAsStringAsync().Result;
                Console.WriteLine(content);
            }
        }

        static void Main(string[] args)
        {
            TestHttp();
            var cn = new SqlConnection("Data Source=10.0.75.1\\SQLEXPRESS,1455;Initial Catalog=Northwind;User ID=docker;Password=SomeStrongPassword;");
            cn.Open();
        }
    }
}

从Visual Studio在Windows上运行时,该应用程序成功运行。但是,当我添加Docker
Support并运行它时,TestHttp方法可以正常运行,但是无法连接到SQL Server,出现以下异常:

System.Data.SqlClient.SqlException
建立与SQL Server的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称正确,并且已将SQL
Server配置为允许远程连接。(提供程序:TCP提供程序,错误:40-无法打开与SQL Server的连接)

这是我的Dockerfile

FROM microsoft/dotnet:2.0-runtime
ARG source
WORKDIR /app
COPY ${source:-obj/Docker/publish} .
ENTRYPOINT ["dotnet", "ConnectSqlServer.dll"]

这是我的docker-compose.yml

version: '3'

services:

  connectsqlserver:
    image: connectsqlserver
    build:
      context: ./ConnectSqlServer
      dockerfile: Dockerfile

我该怎么办才能从运行在Docker容器上的.net core 2.0应用程序连接到Windows主机上运行的本地SQL Server Express?

编辑:

答:禁用Windows防火墙时要小心。

我关闭了Windows防火墙,但仅在域网络上。Windows将DockerNAT适配器视为公共网络。因此Windows防火墙阻止了与SQL
Server的连接。

我关闭了公共网络上的Windows防火墙,现在可以连接了。


阅读 578

收藏
2020-06-17

共1个答案

一尘不染

问题是我没有正确禁用Windows防火墙。

我关闭了Windows防火墙,但仅在域网络上。Windows将DockerNAT适配器视为公共网络。因此Windows防火墙阻止了与SQL
Server的连接。

我关闭了公共网络上的Windows防火墙,现在可以连接了。

2020-06-17