Docker部署ASP.NET Core 8 API无法连接SQL Server Express问题
ASP.NET Core 8 Web API Docker部署后无法连接SQL Server Express问题排查与解决
我开发了一个ASP.NET Core 8 Web API,本地通过HTTPS运行时能正常连接SQL Server Express,但用Docker或Docker Compose部署后,API可以启动却无法连接数据库。相关配置及已知条件如下:
现有配置
Dockerfile
FROM build AS publish ARG BUILD_CONFIGURATION=Release RUN dotnet publish "./Euro_WeatherForecast.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "Euro_WeatherForecast.dll"]
docker-compose.yaml
version: '3.4' services: euro_weatherforecast: image: ${DOCKER_REGISTRY-}euroweatherforecast build: context: . dockerfile: Euro_WeatherForecast/Dockerfile
连接字符串
"ConnectionStrings": { "AppDbContext": "server=sqlserver;port=8080;Data Source=TUF1\\SQLEXPRESS;Initial Catalog=Euronext_WeatherForecast;Integrated Security=True;Encrypt=False" }
已知条件:容器已正常运行,SQL Server和SQL Server Browser服务处于运行状态,防火墙已关闭。
问题排查与解决步骤
1. 修正连接字符串的地址冲突与网络访问问题
Docker容器处于独立网络环境,无法直接通过本地机器名TUF1\\SQLEXPRESS访问宿主SQL Server,且连接字符串中server与Data Source参数冲突,需调整:
- Windows环境:将
Data Source替换为host.docker.internal\\SQLEXPRESS(Docker提供的宿主机器默认别名) - Linux/macOS环境:替换为宿主机器的局域网IP,例如
192.168.1.100\\SQLEXPRESS - 删除冗余的
server=sqlserver;port=8080部分,SQL Server Express默认端口为1433(未修改的情况下),调整后的示例:
"ConnectionStrings": { "AppDbContext": "Data Source=host.docker.internal\\SQLEXPRESS;Initial Catalog=Euronext_WeatherForecast;Integrated Security=True;Encrypt=False;TrustServerCertificate=True" }
2. 调整身份验证方式
Integrated Security=True依赖Windows集成认证,容器内进程无法直接使用宿主Windows凭证,建议改用SQL Server身份认证:
- 在SQL Server中创建具备数据库读写权限的SQL登录账号
- 修改连接字符串为:
"ConnectionStrings": { "AppDbContext": "Data Source=host.docker.internal\\SQLEXPRESS;Initial Catalog=Euronext_WeatherForecast;User ID=你的SQL账号;Password=你的SQL密码;Encrypt=False;TrustServerCertificate=True" }
3. 确保SQL Server允许远程连接
- 打开SQL Server配置管理器,进入
SQL Server网络配置->SQLEXPRESS的协议,启用TCP/IP - 双击
TCP/IP,在IP地址选项卡的IPAll部分,设置TCP端口为1433 - 重启SQL Server服务和SQL Server Browser服务
4. 验证Docker网络访问性
默认的Docker bridge网络已支持容器访问host.docker.internal,无需额外配置;若使用自定义网络,确认网络规则未限制宿主机器访问。
内容的提问来源于stack exchange,提问作者Doraemon
相关产品推荐
相关产品推荐

