Docker环境下Laravel执行php artisan migrate报错求助
Docker环境下Laravel执行
php artisan migrate报错的排查与解决 1. 确认Docker Compose网络与服务名配置
Docker Compose默认会为所有服务创建专属网络,服务间通过服务名互相访问,所以DB_HOST必须对应docker-compose.yml中数据库服务的名称(比如你提到的lar-db)。
- 检查你的
docker-compose.yml数据库服务配置,确保类似如下结构:services: lar-db: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: your_root_password MYSQL_DATABASE: rating MYSQL_USER: your_db_user MYSQL_PASSWORD: your_db_password ports: - "3306:3306" - 确保Laravel服务与数据库服务处于同一网络(默认Compose自动创建,无需额外配置;若手动指定网络,需保证两个服务都加入该网络)。
2. 严格匹配.env与MySQL容器的环境变量
.env中的数据库配置必须和MySQL容器初始化时的环境变量完全一致,重点注意:
DB_CONNECTION=mysql DB_HOST=lar-db # 必须用docker-compose里的数据库服务名,禁止用localhost/127.0.0.1(指向Laravel容器自身) DB_PORT=3306 DB_DATABASE=rating DB_USERNAME=your_db_user # 避免直接用root,除非特意配置root允许远程访问 DB_PASSWORD=your_db_password
3. 检查MySQL用户访问权限
进入MySQL容器,验证数据库用户是否允许从Laravel容器所在网络访问:
- 进入容器:
docker exec -it lar-db mysql -uroot -p - 查看用户权限:
若你的用户SELECT user, host FROM mysql.user;host为localhost,仅允许本地访问,需修改权限:ALTER USER 'your_db_user'@'%' IDENTIFIED BY 'your_db_password'; FLUSH PRIVILEGES; - 确认
rating数据库存在:SHOW DATABASES;
4. 验证Laravel容器与数据库的连通性
进入Laravel容器,测试与数据库服务的连通性:
# 测试域名解析 docker exec -it [你的Laravel容器名] ping lar-db # 测试端口连通 docker exec -it [你的Laravel容器名] telnet lar-db 3306
- 若ping不通:检查Docker网络配置,确认服务名拼写正确
- 若telnet不通:检查MySQL容器端口映射、MySQL服务是否正常启动
5. 清除Laravel配置缓存
修改.env后若未清除缓存,Laravel可能仍使用旧配置:
php artisan config:clear php artisan cache:clear
之后重新执行php artisan migrate。
6. 查看MySQL容器日志定位错误
通过日志获取具体报错原因:
docker logs lar-db
日志会明确提示是权限错误、密码错误还是数据库不存在等问题。
内容的提问来源于stack exchange,提问作者Nik Sidelnikov
相关产品推荐
相关产品推荐

