Docker部署Laravel9无法连接MySQL数据库问题排查
解决Docker环境下Laravel迁移时MySQL 1130主机权限错误
这个错误的核心原因是:你的Laravel应用容器(IP为172.21.0.3)不在MySQL服务允许的连接主机列表中。MySQL默认创建的用户(比如root)通常仅允许从localhost或127.0.0.1连接,而Docker容器间使用虚拟网络IP通信,因此被MySQL拒绝。
以下是具体的解决步骤:
1. 配置Docker Compose创建允许跨主机连接的数据库用户
在docker-compose.yml的MySQL服务块中,添加环境变量来创建专用的应用用户,并允许该用户从任意主机连接:
services: mysql: image: mysql:8.0 # 或你使用的MySQL版本 environment: MYSQL_DATABASE: laravel_db MYSQL_USER: laravel MYSQL_PASSWORD: your_secure_password MYSQL_ROOT_PASSWORD: root_secure_password volumes: - mysql_data:/var/lib/mysql networks: - laravel_network # 你的Laravel应用服务配置... volumes: mysql_data: networks: laravel_network:
其中MYSQL_USER和MYSQL_PASSWORD是给Laravel用的专用账号,MySQL镜像会自动创建这个用户并授予对应数据库的权限,且默认允许从%(任意主机)连接。
2. 修正Laravel的.env数据库配置
确保Laravel的.env文件中,数据库主机填写Docker Compose中MySQL服务的名称(而非IP或localhost),因为容器间通过服务名自动解析:
DB_CONNECTION=mysql DB_HOST=mysql # 对应docker-compose.yml里的mysql服务名 DB_PORT=3306 DB_DATABASE=laravel_db # 和docker-compose里的MYSQL_DATABASE一致 DB_USERNAME=laravel # 和docker-compose里的MYSQL_USER一致 DB_PASSWORD=your_secure_password # 和docker-compose里的MYSQL_PASSWORD一致
3. 若已创建容器,手动修复用户权限
如果之前已经启动过MySQL容器,且数据卷中已存在旧的用户权限配置,可以手动进入MySQL容器调整:
- 进入MySQL容器:
docker-compose exec mysql bash - 登录MySQL:
mysql -u root -p - 执行授权命令(替换对应账号、密码和数据库名):
GRANT ALL PRIVILEGES ON laravel_db.* TO 'laravel'@'%' IDENTIFIED BY 'your_secure_password'; FLUSH PRIVILEGES;
4. 重置MySQL数据卷(可选)
如果上述操作无效,可能是旧的数据卷保留了错误的权限配置,可以删除数据卷后重新创建:
docker-compose down -v docker-compose up -d --build
内容的提问来源于stack exchange,提问作者Meaulnes
相关产品推荐
相关产品推荐

