You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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防火墙测试,若能连接则说明是防火墙规则配置问题。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 22:15:08