使用docker-compose部署MySQL时登录报错:服务器请求未知认证方法
解决MySQL Docker容器与Adminer的认证方式不兼容问题
这个报错SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client的核心原因很明确:你用的是MySQL 8.0.11(从启动日志里能看到),这个版本开始默认使用caching_sha2_password作为认证插件,但Adminer使用的PHP MySQL驱动暂时不支持这种新的认证方式,导致握手失败。
下面给你两种可行的解决方法:
方法一:修改Docker Compose配置,让MySQL默认使用旧认证方式
直接修改你的stack.yml,给MySQL服务添加启动命令,强制使用mysql_native_password(也就是MySQL 5.x时代的旧认证插件):
version: '3.1' services: db: image: mysql restart: always environment: MYSQL_ROOT_PASSWORD: example # 添加这一行,指定默认认证插件 command: --default-authentication-plugin=mysql_native_password adminer: image: adminer restart: always ports: - 8080:8080
然后执行以下命令重启容器:
# 先停止并删除现有容器 docker-compose -f stack.yml down # 重新启动 docker-compose -f stack.yml up
重启后再用Adminer登录,就能正常连接了。
方法二:在已运行的MySQL容器中修改root用户的认证方式
如果你不想重新创建容器,可以直接进入运行中的MySQL容器,手动修改root用户的认证插件:
- 先找到MySQL容器的名称或ID:
docker ps
(你会看到类似hibernate_db_1的容器名)
- 进入容器并登录MySQL:
docker exec -it hibernate_db_1 mysql -uroot -pexample
- 执行SQL语句修改root用户的认证方式:
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'example'; FLUSH PRIVILEGES;
这里用'root'@'%'是因为Docker版MySQL的root用户默认允许从任意主机访问,执行完刷新权限后,退出容器再用Adminer登录即可。
补充说明
从你的终端日志里还能看到Adminer用的是PHP 7.2.5,这个版本的mysqli或pdo_mysql扩展对caching_sha2_password的支持还不完善,所以切换回旧认证方式是最直接的兼容方案。如果后续Adminer更新了驱动,或者你升级了PHP版本,就可以再切换回MySQL 8.0的新认证插件了。
内容的提问来源于stack exchange,提问作者shiuu
相关产品推荐
相关产品推荐

