PMA_HOSTS是唯一可靠方式,因官方Docker镜像仅通过该环境变量批量注册服务器并写入配置,支持登录页下拉切换,而PMA_ARBITRARY仅允许手动输入单个地址且不保存、无UI、不兼容健康检查。
直接用 pma_hosts 环境变量就能让 phpmyadmin 同时管理多个 mysql/mariadb 实例,不需要额外代理或改代码。
为什么 PMA_HOSTS 是唯一可靠方式
官方镜像只支持通过环境变量批量注册服务器,不支持运行时动态添加(PMA_ARBITRARY=1 仅允许手动填单个 IP,无法保存、无 UI 切换、不兼容健康检查)。PMA_HOSTS 是唯一被 phpMyAdmin 官方 Docker 镜像解析并写入配置的多实例机制。
-
PMA_HOSTS值为逗号分隔的主机名列表(如db1,db2,db3),必须与docker-compose.yml中服务名完全一致 -
PMA_VERBOSES提供对应中文/英文别名,显示在登录页下拉框里 -
PMA_PORTS指定各实例端口,未指定则默认3306 - 所有目标数据库服务必须定义
healthcheck,否则 phpMyAdmin 启动时可能因依赖未就绪而报错
docker-compose.yml 多数据库服务配置要点
每个数据库服务需独立定义,不能复用同一镜像加不同环境变量——否则容器名冲突、卷路径冲突、端口映射冲突。
- 服务名(如
db1、db2)必须与PMA_HOSTS中名称严格匹配,大小写敏感 - 每个服务必须挂载独立数据卷(如
db1_data、db2_data),避免数据混写 - 若需对外暴露端口(如调试用),
ports映射必须错开(如"3307:3306"、"3308:3306"),但 phpMyAdmin 内部仍连容器内网端口3306 -
environment中至少设MYSQL_ROOT_PASSWORD,其他如MYSQL_DATABASE可选
示例片段:
services:
db1:
image: mysql:8.0
volumes: [- db1_data:/var/lib/mysql]
environment: [MYSQL_ROOT_PASSWORD: root123]
healthcheck: [test: ["CMD", "mysqladmin", "ping", "-h", "localhost"], interval: 10s]
db2:
image: mariadb:11.4
volumes: [- db2_data:/var/lib/mysql]
environment: [MYSQL_ROOT_PASSWORD: root456]
healthcheck: [test: ["CMD", "mysqladmin", "ping", "-h", "localhost"], interval: 10s]
phpmyadmin:
image: phpmyadmin:latest
environment:
- PMA_HOSTS=db1,db2
- PMA_VERBOSES=生产库,测试库
- PMA_PORTS=3306,3306
- PMA_USER=root
- PMA_PASSWORD=root123 # 注意:此密码只用于 db1,db2 需同名同密,或改用 PMA_ABSOLUTE_URI + 登录页手动输多服务器下密码和权限的现实约束
phpMyAdmin 的 PMA_USER/PMA_PASSWORD 是全局凭证,它只会尝试用这一组账号密码连接所有 PMA_HOSTS 列表里的实例。这意味着:
立即学习“PHP免费学习笔记(深入)”;
- 所有数据库实例必须使用相同的 root 用户名和密码,否则部分连接会失败(错误提示:
Access denied for user 'root'@'xxx') - 如果各库 root 密码不同,只能删掉
PMA_USER/PMA_PASSWORD,改用登录页手动输入——此时PMA_HOSTS仍生效,但每次切换服务器都要重输账号密码 - 更稳妥的做法是:在各数据库中创建统一的管理用户(如
pma_admin),赋予SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, PROCESS, REFERENCES, INDEX, ALTER, SHOW DATABASES, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE权限,再统一用该账号配PMA_USER/PMA_PASSWORD
启动后验证多服务器是否生效
容器启动成功不代表多服务器可用,常见卡点在 DNS 解析和健康检查顺序。
- 执行
docker compose ps,确认所有db*和phpmyadmin状态都是running,且STATUS列无unhealthy - 进 phpMyAdmin 容器查 DNS:
docker compose exec phpmyadmin nslookup db1,应返回容器内网 IP(如172.20.0.2);若失败,说明网络未通或服务名拼错 - 浏览器打开
http://localhost:8080,登录后左上角应出现下拉菜单,选项为PMA_VERBOSES设置的值(如“生产库”“测试库”) - 切换到任一服务器后,右上角显示的连接地址应为对应服务名(如
db2:3306),而非localhost
最易被忽略的是健康检查延迟——depends_on 只等容器启动,不等 MySQL 就绪,必须靠 healthcheck 配合 condition: service_healthy 才能真正串起启动顺序。



















