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