PHP周期性连接MySQL失败:php_network_getaddresses解析错误排查
解决方案
针对Docker容器内PHP偶尔无法解析db.domain.com DNS的问题,结合你的测试结果(主机/Node.js无问题、IP连接正常),可以尝试以下几个针对性方案:
1. 替换Docker容器的DNS服务器
默认Docker容器可能使用的DNS服务器稳定性不足,导致与Cloudflare DNS交互时出现解析波动。直接指定公共DNS服务器:
- 单容器运行时添加参数:
docker run --dns=1.1.1.1 --dns=1.0.0.1 [你的容器镜像] - 使用docker-compose时,在配置文件中添加:
services: web-service: # 其他配置项 dns: - 1.1.1.1 - 1.0.0.1
2. 容器内添加本地hosts映射
跳过DNS查询,直接在容器内绑定域名与主机IP,彻底解决解析问题:
- 单容器运行时添加参数:
docker run --add-host=db.domain.com:你的主机实际IP [你的容器镜像] - docker-compose配置:
services: web-service: # 其他配置项 extra_hosts: - "db.domain.com:192.168.1.10" # 替换为你的主机IP
注意:若主机IP变动,需同步更新此配置,但能保留域名连接的速度优势。
3. 启用PHP mysqlnd扩展的DNS缓存
PHP的mysqli扩展默认可能未启用DNS缓存,导致每次连接都重新解析。开启mysqlnd的DNS缓存功能:
在PHP配置文件(php.ini)中添加或修改:
mysqlnd.dns_cache = On
重启PHP-FPM或容器使配置生效。
4. 调整Docker DNS解析重试策略
修改Docker daemon的DNS超时与重试次数,提升解析成功率:
- 编辑
/etc/docker/daemon.json(若不存在则创建):{ "dns-opts": ["timeout:2", "attempts:3"] } - 重启Docker服务:
systemctl restart docker
5. 检查Cloudflare DNS记录配置
确保db.domain.com未开启Cloudflare代理(橙色云):
- 登录Cloudflare后台,找到该域名的A记录,将云朵图标切换为灰色(仅DNS解析)。数据库连接无需经过Cloudflare代理,开启代理可能导致解析或连接波动。
内容的提问来源于stack exchange,提问作者MJDawson
相关产品推荐
相关产品推荐

