phpMyAdmin容器必须接入Laravel的自定义网络,否则无法通过服务名(如mysql)解析并连接数据库;PMA_HOST必须设为MySQL服务名而非localhost,且需确保MySQL 8.0+启用mysql_native_password插件并允许远程访问。

phpMyAdmin容器必须接入Laravel的自定义网络
默认情况下,phpmyadmin 容器如果单独运行或用 docker run 启动,会落在 bridge 默认网络,而 Laravel 的 app、mysql 等服务通常在自定义网络(如 laravel-network)里——两者不在同一网络,DNS解析失败,mysql 这个服务名根本无法被 phpMyAdmin 解析。
解决方法只有一条:确保 phpmyadmin 服务在 docker-compose.yml 中显式加入和 Laravel 相同的网络:
phpmyadmin:
image: phpmyadmin/phpmyadmin
container_name: pma
environment:
- PMA_HOST=mysql
- PMA_PORT=3306
ports:
- "8081:80"
networks:
- laravel-network # ← 必须和 mysql、app 一致
depends_on:
- mysql注意:networks 是列表,不是字符串;多个网络可写成 ["laravel-network", "other-net"],但至少得包含主网络。
PMA_HOST 必须填 MySQL 服务名,不能是 localhost
phpMyAdmin 容器内部访问数据库,走的是 Docker 内部网络路径。填 localhost 或 127.0.0.1 指向的是它自己,不是 MySQL 容器,必然连接拒绝。
立即学习“PHP免费学习笔记(深入)”;
-
PMA_HOST值必须严格匹配docker-compose.yml中 MySQL 服务的service name,比如mysql、db或database -
PMA_PORT填容器内暴露端口(如3306),不是宿主机映射端口(如3307) - 如果 MySQL 服务用了非标准端口(如
3307),要在mysql服务块中显式声明EXPOSE 3307,并同步改PMA_PORT
MySQL 容器需允许远程连接(尤其 root 用户)
MySQL 8.0+ 默认禁用 root 远程登录,而 phpMyAdmin 是从另一个容器发起连接,属于“远程”。不放开会导致登录失败,错误信息通常是:#1045 Cannot log in to the MySQL server 或 Access denied for user 'root'@'172.20.0.x'。
有两套可行方案:
- 在
mysql服务的environment中加MYSQL_ROOT_HOST=%(仅开发环境可用) - 更安全的做法:创建专用用户,在
docker-compose.yml的mysql块中用command初始化权限:
mysql:
image: mysql:8.0
command: ['--default-authentication-plugin=mysql_native_password']
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: laravel
MYSQL_USER: pmauser
MYSQL_PASSWORD: pmapass
# ... 其他配置
这样 phpMyAdmin 就可以用 pmauser/pmapass 登录,且该用户默认允许从任意 IP 连接。
浏览器访问 phpMyAdmin 时别漏掉 /index.php
某些 phpmyadmin/phpmyadmin 镜像版本(尤其是较新 Alpine 版)默认不启用 URL 重写,直接访问 http://localhost:8081/ 会 404;必须带入口脚本:
- ✅ 正确:
http://localhost:8081/index.php - ❌ 错误:
http://localhost:8081/(空白页或 404)
如果想省略 /index.php,需要挂载自定义 Nginx/Apache 配置,或改用支持 PATH_INFO 的镜像变体(如 phpmyadmin:fpm + 单独 Web 服务器),但对本地调试来说,加个路径是最轻量的解法。
最容易被忽略的是 MySQL 的认证插件兼容性——MySQL 8.0 默认用 caching_sha2_password,而旧版 phpMyAdmin 不支持。不加 command: ['--default-authentication-plugin=mysql_native_password'] 或没设 MYSQL_ROOT_HOST,哪怕网络通、服务名对、端口开,也会静默失败。



















