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网络完全没关系,能连通是正常的。 - 你之前做的重启服务、清缓存、重建容器操作没效果很正常,问题出在最基础的连接地址配置错误,和缓存、容器损坏没有关系。
修复步骤
- 修正数据库连接配置
打开项目根目录的.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
- 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重启容器让配置生效。
检查XAMPP MySQL监听规则
打开XAMPP的MySQL配置文件my.ini,找到bind-address配置项,确保值为0.0.0.0,不要绑定到单独的localhost地址,同时确认宿主机防火墙没有拦截3307端口的入站请求,修改完成后重启XAMPP的MySQL服务。清除容器内配置缓存并验证
所有配置改完后,必须加sail前缀执行缓存清除命令(在宿主机直接执行artisan命令只会清宿主机的缓存,不影响容器内的应用),执行以下命令验证:
sail artisan config:clear sail artisan migrate:status sail artisan migrate
执行完就能正常连接数据库跑迁移了。
避坑提示:不要把Sail容器内的服务端口和宿主机端口搞混,如果你之前尝试过把容器内3306端口映射到宿主机3307,记得先把对应端口映射删掉,避免端口冲突导致连接异常。
内容的提问来源于stack exchange,提问作者Shapperd
相关产品推荐
相关产品推荐

