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

Laravel Sail(Docker)连接XAMPP MySQL报SQLSTATE[HY000][2002]连接拒绝

故障根因
  • 核心矛盾是Docker容器的网络隔离机制:Sail把Laravel应用跑在独立的Docker容器内部,容器内的127.0.0.1指向容器自身的回环地址,根本不会转发到你运行XAMPP的宿主机,自然连不上宿主机上的MySQL。
  • 首次迁移成功的原因非常明确:你第一次跑迁移大概率还没进入Sail容器环境,是直接在宿主机的项目目录下执行的php artisan migrate,这时候命令运行在宿主机上,127.0.0.1直接命中XAMPP的MySQL,当然能正常建表。后续你启动Sail后,用sail artisan migrate或者在容器内执行artisan命令,运行环境切到容器内部,地址不对就直接报连接拒绝。
  • TablePlus连接正常是因为它本身就跑在宿主机上,填的127.0.0.1本来就是宿主机地址,和Docker网络完全没关系,能连通是正常的。
  • 你之前做的重启服务、清缓存、重建容器操作没效果很正常,问题出在最基础的连接地址配置错误,和缓存、容器损坏没有关系。
修复步骤
  1. 修正数据库连接配置
    打开项目根目录的.env文件,把DB_HOST项改成Docker预留的宿主机访问域名,完整配置如下:
DB_CONNECTION=mysql
DB_HOST=host.docker.internal
DB_PORT=3307
DB_DATABASE=site_data
DB_USERNAME=dbUser
DB_PASSWORD=PassWord
  1. Linux环境补充配置(Windows/Mac桌面版Docker直接跳过这步)
    Linux环境下Docker默认不支持host.docker.internal域名,需要手动给Sail容器加宿主机映射。打开项目根目录的docker-compose.yml,找到laravel.test服务块,和ports、volumes配置同级添加以下内容:
extra_hosts:
  - 'host.docker.internal:host-gateway'

保存后执行sail down && sail up -d重启容器让配置生效。

  1. 检查XAMPP MySQL监听规则
    打开XAMPP的MySQL配置文件my.ini,找到bind-address配置项,确保值为0.0.0.0,不要绑定到单独的localhost地址,同时确认宿主机防火墙没有拦截3307端口的入站请求,修改完成后重启XAMPP的MySQL服务。

  2. 清除容器内配置缓存并验证
    所有配置改完后,必须加sail前缀执行缓存清除命令(在宿主机直接执行artisan命令只会清宿主机的缓存,不影响容器内的应用),执行以下命令验证:

sail artisan config:clear
sail artisan migrate:status
sail artisan migrate

执行完就能正常连接数据库跑迁移了。

避坑提示:不要把Sail容器内的服务端口和宿主机端口搞混,如果你之前尝试过把容器内3306端口映射到宿主机3307,记得先把对应端口映射删掉,避免端口冲突导致连接异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 19:18:48