如何通过Docker Compose让Linux容器连接远程SQL Server
解决Linux容器中.NET Core应用无法连接远程SQL Server的问题
以下是逐步排查和解决的思路:
1. 先确认宿主机与SQL Server的连通性
- 在宿主机上执行
ping 192.168.100.186,验证基础网络是否可达 - 测试SQL Server默认端口1433:
telnet 192.168.100.186 1433或nc -zv 192.168.100.186 1433- 如果宿主机都无法连通,问题不在Docker,优先排查SQL Server所在机器的网络、防火墙配置
2. 验证容器内网络配置
- 进入容器终端:
docker exec -it tdi.translator.translationmanager bash - 检查
extra_hosts是否生效:cat /etc/hosts,确认存在DATABASE_SERVER_NAME:192.168.100.186的条目 - 在容器内ping宿主机网关(可通过
ip route查看,通常是172.17.0.1),确认容器自身网络正常 - 若容器内ping不通SQL Server IP,可尝试调整Docker网络模式:
- 在docker-compose中添加
network_mode: host,让容器直接使用宿主机网络(注意此时不需要ports映射,容器与宿主机共享网络栈) - 检查Docker bridge网络的iptables规则,确认没有阻止容器访问外部IP
- 在docker-compose中添加
3. 检查SQL Server的远程访问配置
- 确认SQL Server已启用TCP/IP协议:在SQL Server配置管理器中,打开SQL Server网络配置,启用TCP/IP,并设置监听IP为
0.0.0.0(允许所有IP访问) - 检查SQL Server所在机器的防火墙:开放1433端口,并允许容器所在的Docker子网(默认是172.17.0.0/16)访问
- 确认SQL Server登录账号允许远程连接,且账号密码正确(可在SSMS中检查用户的登录属性)
4. 验证应用连接字符串
- 确保连接字符串中指定的服务器名(
DATABASE_SERVER_NAME)或IP、端口与实际一致,例如:Server=DATABASE_SERVER_NAME,1433;Database=YourDatabase;User Id=YourUser;Password=YourPass;TrustServerCertificate=True;- 若SQL Server使用非默认端口,必须在连接字符串中明确指定
- 若使用自签SSL证书,需添加
TrustServerCertificate=True避免证书验证失败
额外注意点
- 你的docker-compose中
ports映射为5102:5102,但Dockerfile和Kestrel配置中应用监听的是80端口,存在端口不匹配问题,建议修改为ports: - 5102:80,确保外部访问端口正确映射到容器内应用端口
内容的提问来源于stack exchange,提问作者Julien Martin
相关产品推荐
相关产品推荐

