如何从Windows容器连接本地SQL Server数据库?
我有一个包含应用程序的Windows Docker镜像,该应用需要访问主机上安装的SQL Server(My-Computer\SQLEXPRESS)。使用TestContainers编写集成测试时,容器内应用无法连接数据库,测试代码如下:
_network = new NetworkBuilder() .WithName(_name) .Build(); _myContainer = new ContainerBuilder() .WithImage("myWindowsApplication:1.0.0.0") .WithExposedPort(1433) .WithNetwork(_network) .Build(); await _network.CreateAsync(); await _myContainer.StartAsync();
已尝试的方法均失败:
- 使用
Dotnet.TestContainers.Sql:该包的镜像基于Linux,与Windows镜像冲突; - 设置容器为host网络:添加
.WithDriver(NetworkDriver.Host)后启动报错:Docker.DotNet.DockerApiException : Docker API responded with status code=NotFound, response={"message":"could not find plugin host in v1 plugin registry: plugin not found"}
- 使用
(host.docker.internal)\SQLEXPRESS作为服务器名:连接失败。
1. 明确Windows容器的网络限制
Windows容器不支持host网络模式(这是Linux容器专属特性),所以你之前尝试的.WithDriver(NetworkDriver.Host)必然报错,放弃该方案,使用默认的nat网络即可。
2. 修复host.docker.internal连接问题
Windows Docker Desktop默认支持host.docker.internal,连接失败通常是SQL Server的配置问题:
- 打开SQL Server配置管理器,找到
SQL Server网络配置 > SQLEXPRESS的协议,启用TCP/IP; - 进入
TCP/IP属性的「IP地址」标签,找到IPAll项,设置TCP端口为1433; - 重启SQL Server服务;
- 确保SQL Server开启混合身份验证模式,并创建拥有远程连接权限的数据库账号(授予对应库的访问权限)。
完成配置后,重新尝试用host.docker.internal\SQLEXPRESS作为服务器名连接。
3. 直接使用主机IP地址(备用方案)
如果host.docker.internal仍无法解析,直接使用主机的实际IPv4地址(比如192.168.3.10\SQLEXPRESS)作为服务器名。你可以通过主机执行ipconfig命令,找到以太网/WLAN对应的IPv4地址。
4. 调整防火墙设置
确保主机防火墙允许1433端口的入站连接:
- 打开Windows Defender防火墙,创建新的入站规则,允许TCP 1433端口的连接;
- 或者直接允许Docker容器所在的
nat网络段访问(可通过docker network inspect nat命令查看子网范围)。
5. 简化TestContainers配置
不需要自定义网络,默认的nat网络已足够容器访问主机,修改后的代码:
_myContainer = new ContainerBuilder() .WithImage("myWindowsApplication:1.0.0.0") .WithExposedPort(1433) .Build(); await _myContainer.StartAsync();
6. 测试连通性(排查用)
如果仍无法连接,可在容器内测试连通性:
- 进入容器命令行:
docker exec -it <容器ID> cmd - ping主机IP:
ping 192.168.3.10(确认网络可达) - 测试1433端口:
telnet 192.168.3.10 1433(确认端口开放)
内容的提问来源于stack exchange,提问作者user2896152

