根本原因是MySQL容器root用户禁用空密码且默认仅允许本地连接,须设MYSQL_ROOT_PASSWORD和MYSQL_ROOT_HOST='%',并用服务名而非localhost作PMA_HOST;phpMyAdmin白屏因session未持久化,需挂载volumes到/sessions;上传限制需通过environment设UPLOAD_MAX_FILESIZE和POST_MAX_SIZE;404或下载index.php因端口映射错误或Web服务器未正确解析PHP。
docker-compose 启动 phpMyAdmin 报错 “Access denied for user 'root'@'%'”
根本原因是默认配置下,phpmyadmin 尝试用空密码连 mysql 容器的 root 用户,但现代 mysql 镜像(如 mysql:8.0 或 mariadb:11)已禁用空密码登录,且 root 默认只允许本地连接。
- 必须显式设置
MYSQL_ROOT_PASSWORD环境变量,并确保 phpMyAdmin 的PMA_HOST指向正确的数据库服务名(不是localhost) - phpMyAdmin 容器里执行的是远程连接,
localhost会走 socket,应填数据库服务名(如db) - 若用
mysql:8.0,还需加MYSQL_ROOT_HOST=%,否则 root 只能从127.0.0.1连,而容器间是不同 IP
示例关键段落:
services:
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: my-secret-pw
MYSQL_ROOT_HOST: '%'
# ...其他配置
<p>phpmyadmin:
image: phpmyadmin/phpmyadmin
environment:
PMA_HOST: db
PMA_PORT: 3306phpMyAdmin 容器启动后白屏或报 “Error during session start”
这是 phpMyAdmin 内部 session 初始化失败,常见于未挂载持久化 session 目录,或容器重启后 tmpfs 清空导致 session 文件丢失;Docker 默认用内存临时文件系统存 session,一重启就丢。
- 务必通过
volumes挂载一个外部目录到/sessions(phpMyAdmin 官方镜像约定路径) - 挂载路径需有写权限,建议用命名卷而非相对路径,避免权限混乱
- 不要依赖
tmpfs或默认/tmp,它在容器生命周期内不保证持久
补在 phpmyadmin 服务下:
volumes:
- pma_sessions:/sessions
<p>volumes:
pma_sessions:如何让 phpMyAdmin 支持上传大于 2M 的 SQL 文件
限制来自 PHP 层(upload_max_filesize 和 post_max_size),phpMyAdmin 官方镜像默认值太小,必须覆盖 PHP 配置。
立即学习“PHP免费学习笔记(深入)”;
- 不能只改
php.ini文件——该镜像不挂载完整 PHP 配置树,要用PHP_INI_SCAN_DIR加载自定义 ini - 推荐用
environment注入:设UPLOAD_MAX_FILESIZE=64M和POST_MAX_SIZE=64M,镜像会自动写入临时 ini - 若需更高(如 512M),建议用自定义
php-ini-overrides.ini并挂载进/usr/local/etc/php/conf.d/
环境变量方式最简:
environment:
UPLOAD_MAX_FILESIZE: 128M
POST_MAX_SIZE: 128M为什么浏览器访问 http://localhost:8080 显示 404 或直接下载 index.php
本质是 Web 服务器没正确解析 PHP,phpMyAdmin 镜像默认用 Apache,但如果你误配了 Nginx 反代、或宿主机 8080 被占、或端口映射写错,就会出这问题。
- 检查
ports是否写成"8080:80"(Apache 默认 80),不是"8080:8080" - 确认没在宿主机运行其他服务占了 8080,可用
lsof -i :8080(macOS/Linux)或netstat -ano | findstr :8080(Windows)查 - 若用反向代理(如 Nginx),确保 proxy_pass 指向
http://localhost:8080,且 header 正确透传(尤其X-Forwarded-Proto)
最小可运行组合就三行端口映射,别多加花哨配置:
ports:
- "8080:80"实际部署时,最常被跳过的其实是 MYSQL_ROOT_HOST=% 和 volumes 挂载 session——这两个点不处理,前面全通也白搭。











