Laravel 8 migration运行正常 但Docker环境下页面请求MySQL拒绝连接
问题排查与解决方案
故障根因
- 你在本地宿主机执行
php artisan migrate、php artisan db:seed命令时,请求指向宿主机的0.0.0.0:3306,由于docker-compose已经将mysql容器的3306端口映射到宿主机,因此请求可以正常到达mysql服务,命令执行成功。 - 但Laravel服务运行在
web容器内部时,.env配置的DB_HOST=0.0.0.0指向的是web容器自身的回环地址,web容器内没有运行MySQL服务,因此抛出连接拒绝错误。
修复步骤
- 打开项目根目录的
.env文件,修改数据库主机配置:
将
DB_HOST=0.0.0.0
替换为
DB_HOST=mysql
这里的mysql对应docker-compose.yml中定义的MySQL服务的服务名,docker内部DNS会自动将服务名解析为对应容器的内网IP。
- 重启docker-compose服务使配置生效,在项目根目录执行命令:
docker-compose down && docker-compose up -d
补充说明
后续如果需要执行artisan命令,建议直接进入web容器内操作,避免出现宿主机与容器环境配置不一致的问题,执行命令示例如下:
# 进入web容器执行migrate命令 docker-compose exec web php artisan migrate
内容的提问来源于stack exchange,提问作者Andrew Sharifikia
相关产品推荐
相关产品推荐

