Laravel Sail Docker环境下MySQL连接被拒绝问题求助
Laravel Sail 连接MySQL报"Connection refused"的排查与解决
以下是针对该问题的具体解决建议,按优先级排序:
1. 让Laravel容器等待MySQL服务就绪
默认的depends_on仅检查MySQL容器是否启动,不验证服务是否就绪。修改docker-compose.yml中laravel.test服务的depends_on配置,关联MySQL的健康检查:
services: laravel.test: # ...其他配置 depends_on: mysql: condition: service_healthy
修改后重启服务,Laravel容器会等MySQL完全初始化完成后再启动,避免因服务未就绪导致的连接拒绝。
2. 强制MySQL监听所有网卡
mysql/mysql-server:8.0默认仅绑定127.0.0.1,导致容器间无法通过TCP连接。在docker-compose.yml的mysql服务中添加command参数:
services: mysql: # ...其他配置 command: --bind-address=0.0.0.0
该配置会让MySQL监听容器的所有网卡,确保Laravel容器能通过服务名mysql访问到MySQL服务。
3. 再次验证.env.testing的数据库配置
确认.env.testing中的DB_HOST确实为Docker服务名mysql,而非127.0.0.1或localhost:
DB_CONNECTION=mysql DB_HOST=mysql DB_PORT=3306 DB_DATABASE=laravel DB_USERNAME=sail DB_PASSWORD=newpassword
容器内部需通过Docker DNS解析服务名,而非本地回环地址。
4. 清理旧Docker卷并重新初始化
若MySQL卷存在旧数据或配置残留,可能导致连接异常:
# 停止服务并删除卷 ./vendor/bin/sail down -v # 查看并删除目标卷(替换为你的实际卷名) docker volume ls | grep sail-mysql docker volume rm your-project_sail-mysql # 重新启动服务 ./vendor/bin/sail up -d
5. 排查WSL2端口冲突(可选)
若Windows本地运行了MySQL服务,可能占用3306端口导致转发异常。可临时关闭本地MySQL,或修改.env中的端口转发配置:
FORWARD_DB_PORT=33060
此配置仅影响宿主机访问,容器内部仍使用3306端口连接MySQL。
内容的提问来源于stack exchange,提问作者birbhouse
相关产品推荐
相关产品推荐

