Docker环境下Laravel 5执行php artisan migrate报错求助
问题诊断与解决方案
这个错误SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed的核心原因是:Laravel容器无法解析MySQL容器的网络地址,本质是数据库连接的DB_HOST配置不符合Docker Compose的容器间通信规则。
关键配置检查与修正
1. 匹配Docker Compose服务名
Docker Compose会为同一配置文件内的服务创建共享网络,服务名就是容器间可直接访问的DNS别名。你需要:
- 打开
docker-compose.yml,找到MySQL服务的名称(比如services下的mysql:,服务名即为mysql) - 绝对不能用
localhost或127.0.0.1作为数据库主机——Laravel容器内的localhost指向容器自身,而非MySQL容器。
2. 修正.env文件配置
调整.env中的数据库主机参数,替换为Docker Compose里的MySQL服务名:
# 错误示例(无法解析) DB_HOST=localhost DB_HOST=127.0.0.1 # 正确示例(与docker-compose.yml中MySQL服务名一致) DB_HOST=mysql
3. 兜底config/database.php配置
确保config/database.php中的MySQL配置项,优先读取环境变量且默认值设为Docker服务名,避免.env未生效时出错:
'mysql' => [ 'driver' => 'mysql', 'host' => env('DB_HOST', 'mysql'), 'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', 'your-db-name'), 'username' => env('DB_USERNAME', 'root'), 'password' => env('DB_PASSWORD', 'your-db-pass'), // ...其他配置项 ],
4. 容器重启与连通性测试
- 修改配置后,重启Laravel容器:
docker-compose restart apache(替换为你的Apache服务名) - 进入Laravel容器测试网络:
docker exec -it [laravel容器名] ping mysql,能ping通则说明网络配置正常。
额外验证点
- 用
docker-compose ps确认MySQL容器处于正常运行状态 - 确保
.env中的DB_PORT、DB_DATABASE、DB_USERNAME、DB_PASSWORD与docker-compose.yml中MySQL服务的环境变量完全匹配
内容的提问来源于stack exchange,提问作者sora sakamoto
相关产品推荐
相关产品推荐

