Docker化Laravel项目中控制器查询数据库连接被拒绝问题
问题解决:Laravel容器中控制器MySQL连接拒绝,tinker/migrate正常
问题根源
核心问题是执行环境差异:
- 你在宿主机运行
php artisan tinker或php artisan migrate时,用的是宿主机网络环境,127.0.0.1:4306能正确映射到Docker中的MySQL容器,所以连接正常。 - 但Laravel应用在
main容器内部运行,此时容器里的127.0.0.1指向容器自身而非宿主机,无法连接到宿主机映射的4306端口,导致SQLSTATE[HY000] [2002] Connection refused错误。
解决方案
1. 修改Laravel的.env配置
将数据库连接的主机和端口改为Docker内部服务的配置:
DB_CONNECTION=mysql # 使用docker-compose中定义的MySQL服务名作为主机 DB_HOST=db # 使用MySQL容器的内部端口,而非宿主机映射的4306 DB_PORT=3306 DB_DATABASE=main DB_USERNAME=admin DB_PASSWORD=admin
2. 修正docker-compose.yml中的MySQL环境变量(可选但建议)
你的配置里MYSQL_ROOT是无效变量,MySQL官方镜像的正确根用户变量是MYSQL_ROOT_USER,修正后更规范:
db: platform: linux/x86_64 image: mysql:8.0 environment: MYSQL_DATABASE: main MYSQL_USER: admin # 修正为正确的变量名 MYSQL_ROOT_USER: admin MYSQL_PASSWORD: admin MYSQL_ROOT_PASSWORD: root volumes: - ./storage/dbdata:/var/lib/mysql ports: - 4306:3306
3. 重启容器并清除配置缓存
执行以下命令:
# 重启所有服务 docker-compose down && docker-compose up -d # 进入main容器清除配置缓存 docker-compose exec main php artisan config:cache
完成后,容器内的Laravel应用就能通过Docker内部网络连接到db服务对应的MySQL容器。
内容的提问来源于stack exchange,提问作者sina
相关产品推荐
相关产品推荐

