【问题标题】:Can't connect to SQL Server express from .net core app running on docker无法从 docker 上运行的 .net 核心应用程序连接到 SQL Server express
【发布时间】:2017-09-25 15:46:21
【问题描述】:

我的 Windows 10 机器上安装了 SQL Server 2016 Express、适用于 Windows 和 IIS 的 docker。

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();
        }
    }
}

应用在 Windows 上从 Visual Studio 运行时成功运行。但是当我添加 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 防火墙,现在可以连接了。

【问题讨论】:

  • 我正在处理同样的问题。我比你远一点,但仍然卡住了。看看这篇文章。 docs.docker.com/compose/aspnet-mssql-compose
  • @JasonlPrice。但那篇文章是针对在 docker 容器上运行 SQL Server for Linux 的。我在 Windows 主机上运行 SQL Server Express。
  • 感谢 Windows 防火墙的提示!那是为我做的。您可能想自己添加一个答案,如果这样做对您来说,则将其标记为正确。
  • 嘿@JesúsLópez 你能把你对Windows防火墙的评论作为答案吗?我提出了一个问题,我认为这是一个骗局,但在接受此问题的答案之前,我无法关闭我的问题。
  • @Irwin。完毕!我按照您的要求发表了评论作为答案。

标签: c# sql-server docker .net-core visual-studio-2017


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    您可以尝试使用网络模式作为主机启动容器。在这种情况下,容器可以使用 localhost 作为 DNS 名称连接到在主机上运行的应用程序。

    version: '3'
    
    services:
      connectsqlserver:
        image: connectsqlserver
        build:
          context: ./ConnectSqlServer
          dockerfile: Dockerfile
        network_mode: "host"
    

    【讨论】:

    • 但是我可以连接到主机,我可以访问IIS,TestHttp工作。
    • 我认为 network_mode: "host" 仅适用于 linux。我尝试了你的建议,但没有成功,甚至 TestHttp 方法也失败了。
    【解决方案3】:

    对我来说,诀窍是在连接字符串中设置服务器属性,包括 IP、端口。

    Server=10.10.0.27,1433;Database=database;User id=user;password=pwd;
    

    【讨论】:

      猜你喜欢
      • 2021-06-02
      • 2019-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多