如何从Docker容器连接外部非容器化MS SQL Server数据库
容器连接外部独立部署SQL Server排查方案
你当前配置存在多处错误,按以下顺序逐一修正即可解决问题:
1. 修正Dockerfile错误配置
- 你在Dockerfile中写的
EXPOSE 1433完全无效:EXPOSE指令仅用于声明容器内部进程监听的端口,你当前是要从容器向外连接外部SQL Server,不需要暴露1433端口,直接删除该行即可。 - 基础镜像选择错误:运行时阶段不要使用sdk镜像,sdk镜像仅用于编译构建,运行ASP.NET Core应用要使用专门的aspnet runtime镜像,可大幅减小镜像体积,避免不必要的依赖问题。
修正后的Dockerfile参考:
# 运行时阶段使用专用aspnet镜像 FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 AS base WORKDIR /app EXPOSE 5000 # 构建阶段使用sdk镜像 FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build WORKDIR /src COPY UploadCore/UploadCore.csproj UploadCore/ RUN dotnet restore UploadCore/UploadCore.csproj COPY . . WORKDIR /src/UploadCore RUN dotnet build UploadCore.csproj -c Release -o /app FROM build AS publish RUN dotnet publish UploadCore.csproj -c Release -o /app FROM base AS final WORKDIR /app COPY --from=publish /app . ENTRYPOINT ["dotnet", "UploadCore.dll"]
2. 修正容器启动参数
你启动命令中加的-p 1433:1433是将容器内部的1433端口映射到宿主机,只有在容器内部运行SQL Server服务时才需要这个配置,连接外部数据库时直接删除该参数。
另外默认Docker桥接网络无法直接解析内网主机名,这也是你报错提示找不到服务器的核心原因,分两种场景处理:
- 如果SQL Server部署在运行Docker的宿主机上,启动时添加
--add-host=server02:host-gateway参数,让容器将server02主机名直接解析到宿主机网关地址 - 如果SQL Server部署在其他内网服务器上,优先将连接字符串中的服务器名
server02替换为SQL Server的实际内网IP,避免DNS解析失败;如果必须用主机名访问,启动时添加--dns=你的内网DNS服务器IP参数,指定内网DNS保证主机名正常解析。
宿主机部署SQL Server场景下的修正启动命令参考:
docker run -it --rm -p 5000:5000 --add-host=server02:host-gateway --name UploadCore my-app_test:4.5
3. 检查SQL Server侧的远程连接配置
- 打开SQL Server配置管理器,确认对应实例的TCP/IP协议已启用,确认实例监听端口为默认1433(如果修改过端口,连接字符串中要对应填写实际端口)
- 确认SQL Server所在服务器的防火墙放行了1433端口的入站规则,规则适用的网络位置要和服务器当前网络类型(域/专用/公用)匹配
- 确认SQL Server开启了混合身份验证模式,你使用的数据库账号拥有远程登录和对应库的访问权限,不要使用Windows集成认证——容器没有宿主机或域的账号凭证,集成认证必然失败。
4. 修正数据库连接字符串
你的报错明确提示Connection string is not valid,要严格按照SQL Server连接字符串格式配置,参考格式如下:
Server=server02,1433;Database=MIS_REPORTS;User Id=你的数据库账号;Password=你的数据库密码;Encrypt=False;TrustServerCertificate=True;
注意两个容易踩的坑:
- SQL Server连接字符串中,服务器地址和端口之间用逗号分隔,不要用冒号
- .NET Core 3.1配套的Microsoft.Data.SqlClient默认强制加密连接,内部环境如果没有配置可信SSL证书,必须加上
Encrypt=False;TrustServerCertificate=True参数,否则会因为证书校验失败连接被拒绝。
内容的提问来源于stack exchange,提问作者Breaking News
相关产品推荐
相关产品推荐

