为何host.docker.internal无法解析主机内部IP?
验证容器内host.docker.internal的解析有效性
进入Laravel容器的终端,执行以下命令检查域名解析:ping host.docker.internal nslookup host.docker.internal如果无法解析到主机的IP地址,说明Docker的内置域名解析存在问题,需要检查Docker Desktop的配置。
检查Docker Desktop的网络配置项
打开Docker Desktop偏好设置,进入Resources->Network面板,确认Enable host.docker.internal and gateway.docker.internal选项已勾选。部分Docker版本升级后该选项可能被默认关闭,重新勾选后需重启Docker Desktop生效。测试容器到主机3306端口的连通性
在容器内执行端口连通性测试命令,确认主机MySQL端口未被拦截:telnet host.docker.internal 3306 # 或者使用nc命令(若容器内已安装) nc -zv host.docker.internal 3306如果连接失败,检查MacOS系统防火墙:进入「系统偏好设置」->「安全性与隐私」->「防火墙」,确认未阻止MySQL的入站连接,可临时关闭防火墙再次测试。
确认MySQL用户权限配置生效
登录主机的MySQL服务,执行以下命令验证用户权限:-- 查看root用户的host配置 SELECT user, host FROM mysql.user WHERE user='root'; -- 查看root用户的权限范围 SHOW GRANTS FOR 'root'@'%';确保
host字段为%(允许所有IP访问),且权限包含连接数据库所需的权限(如ALL PRIVILEGES或指定的读写权限),若配置有修改需执行FLUSH PRIVILEGES;刷新权限。清除Laravel配置缓存
Laravel会缓存环境配置,修改.env后可能未立即生效,进入容器执行以下命令清除缓存:php artisan config:clear php artisan cache:clear清除缓存后重启Laravel应用或容器,再测试连接。
检查Docker Compose的网络配置
若使用自定义网络,在docker-compose.yml中添加extra_hosts配置,显式映射host.docker.internal到主机网关:services: laravel: # 其他配置... extra_hosts: - "host.docker.internal:host-gateway"执行
docker-compose down && docker-compose up -d重启容器后测试。
内容的提问来源于stack exchange,提问作者Wcan

