Docker部署的Nginx、Laravel、PHP连接本地Windows SQL Server Express
排查Docker容器连接Windows本地SQL Server Express的问题
1. 确认SQL Server实际监听端口
- 打开Windows服务,找到
SQL Server (SQLEXPRESS),右键属性→登录页,确认服务运行账户权限(建议用Local System,避免权限限制)。 - 打开SQL Server配置管理器,展开SQL Server网络配置→SQLEXPRESS的协议,确保TCP/IP已启用。
- 双击TCP/IP→IP地址标签,拉到最下方的IPAll项:
- 若配置了静态端口,
TCP端口会显示你设置的数值(如1433或49172),TCP动态端口为空; - 若
TCP动态端口有值,这才是SQL Server实际使用的端口,必须用该端口连接。
- 若配置了静态端口,
- 用Windows命令行执行
netstat -ano | findstr "SQLSERVR.EXE",查看进程对应的监听端口,确认实际端口号。
2. 验证容器内端口连通性
- 不要只依赖
ping host.docker.internal,在容器内用telnet host.docker.internal <端口号>或nc -zv host.docker.internal <端口号>测试端口是否能连通:- 若连接失败,回到Windows防火墙检查:
- 确认防火墙规则的网络类型(私有/域网络)匹配Docker所在网络;
- 规则的本地端口必须是SQL Server实际监听的端口,远程端口设为“所有端口”;
- 可临时关闭Windows防火墙测试,若能连接则说明是防火墙规则配置问题。
- 若连接失败,回到Windows防火墙检查:
3. Laravel配置细节检查
- 确认
.env中的数据库配置:DB_CONNECTION=sqlsrv DB_HOST=host.docker.internal DB_PORT=<实际端口号> DB_DATABASE=<你的数据库名> DB_USERNAME=<SQL账号,如sa> DB_PASSWORD=<对应密码> - 检查
config/database.php的sqlsrv配置,确保trust_server_certificate设为true:'sqlsrv' => [ 'driver' => 'sqlsrv', 'host' => env('DB_HOST', 'localhost'), 'port' => env('DB_PORT', '1433'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'charset' => 'utf8', 'prefix' => '', 'prefix_indexes' => true, 'trust_server_certificate' => true, ], - 执行
php artisan config:clear清除配置缓存,避免旧配置生效。
4. SQL Server登录权限配置
- 打开SQL Server Management Studio,登录SQLEXPRESS,检查目标登录账号(如sa)的状态:确保“登录”为启用状态。
- 右键目标数据库→属性→权限,确认该账号拥有对应数据库的读写权限。
- 右键服务器→属性→连接,勾选“允许远程连接到此服务器”。
5. 跳过框架直接测试PDO连接
- 在容器内创建简单测试脚本,排除Laravel框架的配置干扰:
<?php try { $conn = new PDO("sqlsrv:Server=host.docker.internal,<端口号>;Database=<数据库名>;TrustServerCertificate=Yes", "<用户名>", "<密码>"); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); echo "连接成功"; } catch(PDOException $e) { echo "连接失败: " . $e->getMessage(); } ?> - 执行该脚本,查看具体错误信息(而非仅返回'None'),错误提示能直接定位问题(如账号密码错误、端口不通、驱动缺失等)。
内容的提问来源于stack exchange,提问作者Wispers
相关产品推荐
相关产品推荐

