Laravel Telescope通过Docker网桥连接MySQL失败的域名解析问题
问题重现
执行Laravel命令 make:job Health/ProxmoxHeartBeatJob 时,Telescope尝试写入telescope_entries表失败,抛出错误:
SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo for mysql failed: Temporary failure in name resolution
底层异常为PDOException,起源于Laravel数据库连接器初始化PDO时的网络地址解析失败,环境为Docker网桥网络。
排查与解决步骤
验证容器网络归属
确保Laravel容器和MySQL容器处于同一个Docker网桥网络:# 查看指定网桥网络下的容器列表及IP docker network inspect [你的网桥名称] | grep -E "Name|IPv4Address"如果两个容器不在同一网络,将Laravel容器连接到MySQL所在的网络:
docker network connect [目标网桥名称] [laravel容器名/ID]检查数据库配置的HOST值
打开Laravel项目的.env文件,确认DB_HOST设置为MySQL容器的服务名/容器名(而非localhost或127.0.0.1,容器内的localhost指向自身而非宿主机):# 正确示例(对应docker-compose中mysql服务名) DB_HOST=mysql DB_PORT=3306 DB_DATABASE=your_db_name DB_USERNAME=your_db_user DB_PASSWORD=your_db_pass修改后执行配置清理:
php artisan config:clear测试容器内DNS解析能力
进入Laravel容器,测试MySQL服务名的解析:docker exec -it [laravel容器名/ID] nslookup mysql正常应返回MySQL容器的IP地址。如果解析失败,检查容器的DNS配置:
docker exec -it [laravel容器名/ID] cat /etc/resolv.conf确保包含Docker内部DNS服务器
127.0.0.11,若缺失则重启容器:docker restart [laravel容器名/ID]临时使用容器IP绕过DNS
如果DNS问题暂时无法解决,可直接使用MySQL容器的IP地址作为DB_HOST:# 获取MySQL容器IP docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' [mysql容器名/ID]将
.env中的DB_HOST替换为该IP,清理配置后重试命令。确认Telescope数据库配置一致性
检查config/telescope.php中的数据库配置,确保没有单独指定错误的数据库连接:// config/telescope.php 'database' => [ 'connection' => env('DB_CONNECTION', 'mysql'), // ... 其他配置 ],
内容的提问来源于stack exchange,提问作者ID64356

