我在Windows 10计算机上安装了SQL Server 2016 Express,适用于Windows的docker和IIS。
SQL Server Express配置为在1455端口上侦听。罗斯文(Northwind)示例数据库在那里。
Windows防火墙已禁用。
Ipconfig 显示以下内容:
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:
Dockerfile
FROM microsoft/dotnet:2.0-runtime ARG source WORKDIR /app COPY ${source:-obj/Docker/publish} . ENTRYPOINT ["dotnet", "ConnectSqlServer.dll"]
这是我的docker-compose.yml:
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防火墙,现在可以连接了。
问题是我没有正确禁用Windows防火墙。