You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

无法从Docker容器连接远程SQL Server问题求助

Docker容器无法连接远程SQL Server(主机可正常访问)的排查与解决

看起来你碰到了一个很典型的Docker网络适配问题——主机能通过SSMS正常连接办公室的远程SQL Server,两周前容器也能正常访问,但现在容器里不仅ping不通服务器,还抛出了网络连接超时/无法访问的错误,而且降级Windows版Docker到18.03.0-CE后就恢复了。结合你的描述和配置,我整理了一些排查思路和解决方向:

一、核心问题定位:容器网络与主机网络的连通性差异

你已经发现容器内ping不通目标SQL Server,这说明容器的网络栈无法访问办公室局域网内的服务器,而主机能正常访问,基本可以排除SQL Server的远程连接配置问题(毕竟主机和之前的容器都能连)。重点要排查Docker的网络配置:

1. 切换网络模式快速验证

你的docker-compose使用了自定义的bridge网络(app-net),默认情况下Docker的bridge网络是NAT模式,依赖主机的网络转发能力。可以先临时切换为host网络测试连通性:
修改php服务的docker-compose配置:

php:
  build:
    context: ./
    dockerfile: .docker/php/DockerFile
  volumes:
    - ./:/var/www
  network_mode: host  # 临时改为主机网络模式

重启容器后,在容器内尝试ping SQL Server的IP地址,如果能通,说明自定义bridge网络的转发规则存在问题。

2. 排查Docker新版本的网络适配冲突

降级到18.03.0-CE后恢复正常,说明你之前使用的Docker新版本(高于这个版本)在Windows环境下的网络栈可能和办公室局域网环境存在冲突,常见的情况包括:

  • WSL2后端的网络适配问题(如果你的Docker是基于WSL2运行的)
  • 新版本Docker的NAT规则、防火墙规则变更,导致容器无法穿透到局域网
  • 容器内DNS解析异常,无法识别SQL Server的主机名

针对这些情况,可以尝试以下操作:

  • 检查并手动指定DNS:进入容器执行cat /etc/resolv.conf,对比主机的DNS配置,如果不一致,在docker-compose中为php服务手动指定DNS服务器:
php:
  build:
    ...
  dns:
    - 你的办公室局域网DNS地址
    - 8.8.8.8
  • 重置Docker网络:在Windows命令行执行docker network prune清理无用网络,然后重启Docker Desktop,再重新启动你的容器。

二、验证SQL Server驱动配置(排除驱动层面问题)

虽然你之前能正常连接,但还是可以快速确认下容器内的SQL驱动是否正常工作:

  1. 进入php容器,执行php -m | grep sqlsrv,确认输出中包含sqlsrvpdo_sqlsrv模块。
  2. 使用容器内已安装的mssql-tools测试连接:
sqlcmd -S 你的SQL Server地址,端口号 -U 用户名 -P 密码

如果是驱动问题,会抛出驱动相关的错误,而非网络超时类的提示。

三、临时解决:保留兼容版本

既然降级到18.03.0-CE能解决问题,说明这个版本的网络栈和你的办公室环境兼容性更好。如果暂时找不到新版本的适配方案,可以继续使用这个稳定版本,同时关注Docker官方的更新日志,看是否有修复类似局域网连通性的问题。

内容的提问来源于stack exchange,提问作者Anders Andersen

火山引擎 最新活动