我在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核心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防火墙,现在可以连接。
答案 0 :(得分:2)
问题是我没有正确禁用Windows防火墙。
我关闭了Windows防火墙,但仅在域网络上。 Windows将DockerNAT适配器视为公共网络。因此Windows防火墙阻止了与SQL Server的连接。
我在公共网络上关闭了Windows防火墙,现在可以连接了。
答案 1 :(得分:0)
您可以尝试使用网络模式作为主机启动容器。在这种情况下,容器可以使用 localhost 作为DNS名称连接到主机上运行的应用程序。
version: '3'
services:
connectsqlserver:
image: connectsqlserver
build:
context: ./ConnectSqlServer
dockerfile: Dockerfile
network_mode: "host"
答案 2 :(得分:0)
对我来说,诀窍是在连接字符串中设置服务器属性,使用 IP、端口。
Server=10.10.0.27,1433;Database=database;User id=user;password=pwd;