根本原因是dns解析失败,即phpmyadmin容器无法通过pma_host指定的主机名(如mariadb)解析到数据库容器ip,需确保二者在同一docker网络、pma_host与目标容器名完全一致、且避免使用localhost指向宿主机。

phpMyAdmin 切换服务器时出现 php_network_getaddresses 错误,根本原因不是 PHP 或 phpMyAdmin 本身坏了,而是它压根找不到你要连的那个数据库主机名——DNS 解析失败了。
确认容器间网络是否互通(Docker 场景)
在飞牛 FnOS、Portainer 或自建 Docker 环境中,phpMyAdmin 和数据库(如 mariadb)必须处于同一 Docker 网络,且主机名要能互相解析。
- 默认情况下,Docker 容器只能通过 容器名 互相访问(不是镜像名,也不是
localhost) - 如果 MariaDB 容器实际名字是
mariadb-2026,但 phpMyAdmin 配置里写的是db,就会报getaddrinfo for db failed - 用
docker network inspect查看两个容器是否在同一个自定义网络(比如myapp_net),不在就得docker network connect手动加入 - 临时验证:进 phpMyAdmin 容器执行
ping mariadb或nslookup mariadb,不通就说明网络或 DNS 层没打通
检查 PMA_HOST 环境变量是否匹配容器名
phpMyAdmin 不读 config.inc.php 里的 $cfg['Servers'][1]['host'](Docker 镜像通常忽略它),而是优先取环境变量 PMA_HOST。
- 确保
PMA_HOST的值和目标数据库容器的container_name完全一致(区分大小写) - 例如 MariaDB 容器启动命令含
--name my-mysql-db,那PMA_HOST就得设成my-mysql-db,不能写mysql或localhost - 若使用 docker-compose.yml,直接在 phpMyAdmin 服务下加:
environment:<br> - PMA_HOST=mariadb<br> - PMA_PORT=3306
- 改完必须
docker restartphpMyAdmin 容器,环境变量不会热加载
避免用 localhost 或 127.0.0.1 指向宿主机服务
当 phpMyAdmin 容器想连宿主机上跑的 MySQL,写 localhost 是错的——它会指向容器自己的回环地址,而不是宿主机。
- Docker for Mac/Windows 可用
host.docker.internal(无需额外配置) - Linux 下需显式加
--add-host=host.docker.internal:host-gateway启动 phpMyAdmin 容器 - 或者干脆把宿主机 MySQL 绑定到一个可被 Docker 网络访问的 IP(如
0.0.0.0:3306),再用宿主机真实局域网 IP(如192.168.1.100)代替localhost - 注意 MySQL 用户权限:账号得允许从
%或具体 Docker 网段 IP 登录,不能只限localhost
绕过 DNS 依赖:直接填 IP(临时排障用)
如果域名或容器名始终解析失败,又急需进库查数据,最直白的办法是跳过 DNS,用 IP 地址硬编码。
- 查 MariaDB 容器 IP:
docker inspect mariadb | grep IPAddress - 把
PMA_HOST改成那个 IPv4 地址(如172.20.0.3),PMA_PORT保持3306 - 这个方法治标不治本,因为容器重启后 IP 可能变;但它能快速验证是不是纯 DNS 问题
- 若填 IP 也失败,问题就转向防火墙、MySQL 绑定地址(
bind-address)、或用户权限了
真正卡住的地方往往不是代码或配置写错了,而是容器网络模型和 DNS 解析机制这两层被当成“透明背景”忽略了——尤其当容器名、网络、环境变量三者没对齐时,getaddrinfo 连尝试都懒得试,直接返回 Name or service not known。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











