跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

如何利用phpMyAdmin管理Docker容器中的多个数据库_桥接网络与主机名解析

phpMyAdmin 容器无法连接 MySQL 容器的根本原因是 localhost 指向自身而非数据库容器,需用服务名(如 mysql-db)作为 host,并确保两容器在同一自定义桥接网络;同时需配置 MySQL 监听 0.0.0.0、授权远程用户、设置 utf8mb4 字符集及兼容认证插件。 phpMyAdmin 连不到 Docker 里的 MySQL:主机名写成
localhost
就错 容器里跑的 mysql,phpmyadmin 容器默认连不上,根本原因是
localhost
在 phpmyadmin 容器内部指向它自己,不是你的数据库容器。docker 桥接网络里必须用服务名(也就是容器名或
docker-compose.yml
里定义的 service 名)当主机名。 实操建议: 确认数据库容器启动时设置了
container_name
或在
docker-compose.yml
中定义了明确的 service 名,比如
mysql-db
phpMyAdmin 的配置里,
host
字段填
mysql-db
,不是
127.0.0.1
或
localhost
确保两个容器在同一个自定义桥接网络里(别用默认
bridge
),例如通过
docker network create mynet
创建,并在
docker run
或
compose
中显式指定
networks: [mynet]
如果用
docker-compose.yml
,直接复用 service 名即可,Docker 内置 DNS 会自动解析
mysql-db
到对应容器 IP 多个数据库共存时,phpMyAdmin 怎么区分连接?靠
AllowArbitraryServer
+ 手动输 host 默认 phpMyAdmin 只允许连接配置文件里写死的服务器,想临时切到另一个容器数据库,得开手动输入模式——但这个开关不安全,不能暴露在公网。 实操建议: 编辑
config.inc.php
,加上
$cfg['AllowArbitraryServer'] = true;
登录页就会出现
Server hostname:
输入框,填另一个容器的服务名,比如
mysql-legacy
只在开发/内网环境启用,生产环境禁用;配合 Nginx 做 IP 白名单更稳妥 若需长期管理多个库,不如为每个数据库配独立的 phpMyAdmin 实例(不同端口 + 不同
config.inc.php
),避免混用凭据和权限 Docker 桥接网络下,
ping
得通但
mysql -h mysql-db -u root -p
连不上:大概率是 MySQL 绑定地址或权限问题
ping
通只说明网络层可达,MySQL 层还有两道关卡:是否监听容器内所有接口、用户是否被授权从其他容器 IP 登录。 立即学习 “ PHP免费学习笔记(深入) ”; 实操建议: 进 MySQL 容器执行
ss -tlnp | grep :3306
,看
Listen
地址是不是
*:3306
或
0.0.0.0:3306
;如果是
127.0.0.1:3306
,要改
my.cnf
里的
bind-address = 0.0.0.0
检查用户权限:
SELECT Host, User FROM mysql.user;
,确保有类似
'root'@'%'
或
'admin'@'172.18.%'
这样的记录(
%
表示任意主机,但 MySQL 8+ 默认禁用,推荐用子网段更安全) MySQL 8+ 默认认证插件是
caching_sha2_password
,phpMyAdmin 旧版本可能不兼容,可临时建用户指定
mysql_native_password
:
CREATE USER 'pma'@'%' IDENTIFIED WITH mysql_native_password BY 'pass';
phpMyAdmin 容器里中文显示乱码、导出 SQL 有问号:关键在
collation_server
和
init_connect
不是浏览器编码问题,是 MySQL 容器启动时没设对字符集,导致 phpMyAdmin 读出来的字段元信息、查询结果、甚至建表语句都默认用 latin1。 实操建议: MySQL 容器启动时加环境变量:
MYSQL_COLLATION=utf8mb4_unicode_ci
(Docker Hub 官方镜像支持) 或者挂载自定义
my.cnf
,写明:
[mysqld] collation-server = utf8mb4_unicode_ci init-connect='SET NAMES utf8mb4' character-set-server = utf8mb4
phpMyAdmin 容器也要同步设好:在
config.inc.php
加上
$cfg['DefaultCharset'] = 'utf-8'; $cfg['DefaultLang'] = 'zh_CN';
已有数据库和表不会自动转字符集,要用
ALTER DATABASE xxx CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
逐个升级 Docker 网络本身不处理字符集、权限、SQL 协议兼容性这些事,容易误以为“能 ping 通=能连上”,其实每层都有自己的开关和默认值。最常漏掉的是 MySQL 的
bind-address
和用户
Host
匹配,这两个不调对,其他全白搭。

相关文章