如何将.NET Docker Compose连接至运行中的SQL Server容器
问题:Docker Compose部署的.NET API无法连接已运行的SQL Server Docker容器
我在Linux环境下用Docker Compose启动.NET API,API成功启动且Swagger正常运行,但容器无法连接数据库,报错:
建立与SQL Server的连接时发生与网络相关或特定于实例的错误。未找到服务器或无法访问服务器。请验证实例名称是否正确,并且SQL Server已配置为允许远程连接。(provider: TCP Provider, error: 40 - 无法打开到SQL Server的连接: 无法打开到SQL Server的连接)
想确认:能否将Docker Compose部署的API连接到已运行的MS-SQL Docker容器?
我的Docker Compose配置:
version: '3.4' services: vldonvehicle: image: ${DOCKER_REGISTRY-}api ports: - "8000:5000" environment: - ASPNETCORE_ENVIRONMENT=Development - ASPNETCORE_URLS=https://+:443;http://+:80 - ASPNETCORE_Kestrel__Certificates__Default__Password=password - ASPNETCORE_Kestrel__Certificates__Default__Path=/https/cert.pfx - DATABASE_PUBLIC_URL=localhost,1433 build: context: . dockerfile: Re_VLDonFeedStock_WebApi/Dockerfile volumes: - ~/.aspnet/https:/https:ro
连接字符串:
... "ConnectionStrings": { "Default": "Initial Catalog=CRMService; Data Source=localhost,1433; Persist Security Info=True;User ID=sa;Password=password; TrustServerCertificate=True" }, ...
解决方案
完全可行,问题核心是容器内的localhost指向容器自身,而非宿主机或其他Docker容器,以下是两种有效解决方法:
方法一:使用Docker共享网络(推荐)
Docker容器间通过共享网络可直接用容器名/别名通信,步骤如下:
- 确认或创建SQL Server容器所在的Docker网络:
- 执行
docker network ls查看现有网络,若未专门创建,执行docker network create mssql-network新建 - 将已运行的SQL Server容器加入该网络:
docker network connect mssql-network <你的SQL Server容器名称/ID>
- 执行
- 修改Docker Compose配置,将API容器加入同一网络:
version: '3.4' services: vldonvehicle: # 保留原有所有配置 networks: - mssql-network networks: mssql-network: external: true # 标记为已存在的外部网络 - 更新连接字符串的
Data Source为SQL Server容器的名称(例如容器名为mssql,则写为mssql,1433):"ConnectionStrings": { "Default": "Initial Catalog=CRMService; Data Source=mssql,1433; Persist Security Info=True;User ID=sa;Password=password; TrustServerCertificate=True" }
方法二:使用宿主机映射地址
若SQL Server容器已将1433端口映射到宿主机(启动时带-p 1433:1433参数),可直接用Linux Docker内置的宿主机别名host.docker.internal替换localhost:
修改连接字符串:
"ConnectionStrings": { "Default": "Initial Catalog=CRMService; Data Source=host.docker.internal,1433; Persist Security Info=True;User ID=sa;Password=password; TrustServerCertificate=True" }
额外检查项
- 确认SQL Server容器的
sa密码与连接字符串中的完全一致 - 执行
docker logs <SQL Server容器名>,验证容器无启动错误 - 保留
TrustServerCertificate=True,避免Linux环境下的SSL证书验证问题
内容的提问来源于stack exchange,提问作者Alexandr Gevorkyan
相关产品推荐
相关产品推荐

