Docker Compose是解决多容器编排痛点的唯一可靠方案:它通过docker-compose.yml统一定义网络、环境变量、启动顺序和健康检查,避免手动docker run导致的DNS不通、密码不一致、认证插件兼容性等90%人卡住的问题。

docker-compose 是唯一靠谱的一键方案,手动 docker run 搭两个容器并连通网络、配置权限、处理认证插件兼容性,90% 的人会在第 3 步卡住。
为什么必须用 docker-compose.yml 而不是两条 run 命令?
MySQL 8.0 默认使用 mysql_native_password 认证插件,而 phpMyAdmin 官方镜像(phpmyadmin/phpmyadmin)在较新版本中仍依赖旧协议;单独启动时,容器间 DNS 不通、环境变量无法自动注入、root 密码不一致,直接导致 phpMyAdmin 页面报错 #2002 Cannot log in to the MySQL server。
用 docker-compose 可以:
- 在同一网络下让容器通过服务名互相解析(如 phpMyAdmin 直接连 mysql-db)
- 用 environment 统一传递 MYSQL_ROOT_PASSWORD
- 用 depends_on 控制启动顺序(虽不保证 MySQL 已 ready,但配合健康检查可补救)
- 所有配置集中在一个文件里,删环境只需 docker-compose down
docker-compose.yml 必须包含的 4 个关键字段
以下是最小可用配置(Windows / macOS / Linux 通用),存为 docker-compose.yml:
version: '3.8'
services:
mysql-db:
image: mysql:8.0
container_name: mysql8
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: root123
MYSQL_DATABASE: demo
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/conf/my.cnf:/etc/mysql/conf.d/my.cnf:ro
ports:
- "3306:3306"
healthcheck:
test: ["CMD", "mysqladmin", "-uroot", "-proot123", "ping", "-h", "localhost"]
timeout: 20s
retries: 10
<p>phpmyadmin:
image: phpmyadmin/phpmyadmin
container_name: pma
restart: unless-stopped
depends_on:
mysql-db:
condition: service_healthy
environment:
PMA_HOST: mysql-db
PMA_PORT: 3306
PMA_ARBITRARY: 1
ports:</p>
- "8080:80" volumes:
- /session
注意点:
-
PMA_ARBITRARY: 1允许你在登录页手动输入任意 MySQL 主机(绕过硬编码限制) -
volumes: - /session是空挂载,避免 phpMyAdmin 报 session 写入失败 -
my.cnf文件必须存在(哪怕只写一行),否则 MySQL 8.0 容器会因配置缺失退出;内容至少含:[mysqld]<br>default_authentication_plugin=mysql_native_password
-
healthcheck和depends_on.condition联用,才能真正等 MySQL 启动完成再拉起 phpMyAdmin
第一次运行前必须做的三件事
缺一不可,否则大概率白忙活:
- 在当前目录创建
./mysql/conf/my.cnf并写入认证插件配置(上文已说明) - 确保
./mysql/data目录为空或不存在——若之前跑过其他 MySQL 容器,残留的ibdata1或mysql.sock会导致新容器反复 crash - Windows 用户确认 Docker Desktop 已启用 WSL 2 后端,并且当前终端(PowerShell / WT)运行在非管理员模式下(管理员模式会干扰 volume 挂载权限)
访问 phpMyAdmin 时连不上 MySQL 的真实原因
常见现象是页面显示 mysqli::real_connect(): (HY000/1045): Access denied for user 'root'@'172.20.0.3',本质就两个可能:
一是 mysql-db 容器没起来,执行 docker logs mysql8 看是否报 Can't start server : Bind on unix socket —— 这说明 ./mysql/data 里有残留文件,删掉重来;
二是 phpmyadmin 容器里的 PMA_HOST 指向错误,别手欠改成 localhost 或 127.0.0.1,它必须填 mysql-db(即 docker-compose 中定义的服务名);
三是密码不一致:检查 mysql-db 的 MYSQL_ROOT_PASSWORD 和 phpMyAdmin 登录页输的是否完全一样(注意空格、大小写、特殊字符是否被 shell 截断)。
最省事的验证方式:进 phpMyAdmin 容器执行 nc -zv mysql-db 3306,通了再试登录。不通就别折腾界面,先看 MySQL 容器日志。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











