You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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容器调整:

  1. 进入MySQL容器:
    docker-compose exec mysql bash
    
  2. 登录MySQL:
    mysql -u root -p
    
  3. 执行授权命令(替换对应账号、密码和数据库名):
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 08:20:32