Docker容器运行EF Core应用连接本地SQL Server报错求助
Docker容器访问宿主机SQL Server连接失败解决方案
1. 确认Docker环境配置文件已正确加载
你当前的问题大概率是appsettings.Docker.json没有被正确发布到容器中,默认情况下新增的配置文件不会自动复制到输出目录:
- 右键API项目中的
appsettings.Docker.json,选择「属性」,将「复制到输出目录」设置为「如果较新则复制」;或者直接在API项目的.csproj文件中添加如下配置:
<ItemGroup> <None Update="appsettings.Docker.json"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> </ItemGroup>
- 验证方式:容器启动后执行
docker exec -it testapi bash进入容器,查看appsettings.Docker.json是否存在,也可以临时加个测试接口打印当前读取的连接字符串,确认已经是host.docker.internal的版本。
2. 配置本地SQL Server允许远程连接
本地安装的SQL Server默认禁用远程连接,Docker容器访问属于远程访问范畴,需要手动开启:
- 打开SQL Server配置管理器,进入「SQL Server网络配置」→「对应实例的协议」,确保TCP/IP选项已启用
- 双击TCP/IP,切换到「IP地址」标签,拉到最底部的「IPALL」配置段,将TCP端口设置为
1433,保存后重启SQL Server服务 - 打开Windows防火墙,添加入站规则:允许TCP协议1433端口入站,也可以直接添加规则允许
sqlservr.exe程序接收外部连接。
3. 完善连接字符串配置
高版本SQL Server默认开启加密连接校验,会导致非本地客户端连接失败,修改appsettings.Docker.json中的连接字符串为:
"DefaultConnectionString": "Server=host.docker.internal,1433;Database=LOCALDatabase;User id=userid;password=password;TrustServerCertificate=True;Encrypt=False"
如果你用的是SQL Server命名实例(比如默认的SQLEXPRESS),则Server参数改为
host.docker.internal\\SQLEXPRESS,1433;生产环境请根据实际安全需求调整加密和证书校验配置。
4. Linux Docker环境额外配置
如果你的Docker运行在Linux系统上,host.docker.internal默认不会自动解析,运行容器时需要加--add-host参数手动映射:
docker run -it -p 7277:80 -e "ASPNETCORE_ENVIRONMENT=Docker" --add-host=host.docker.internal:host-gateway --name testapi test-api:v1
内容的提问来源于stack exchange,提问作者Learning Curve
相关产品推荐
相关产品推荐

