无法通过Adminer登录MySQL,疑docker-compose.yml配置有误求助
MySQL Docker容器访问权限问题排查
问题描述
我正在构建一个基于Docker的Web应用,使用如下docker-compose.yml配置,所有容器已正常运行:
Version: '3' Services: nginx: build: context: ./lde/nginx ports: - 80:80 volumes: - ./www:/var/www/html - ./www/errors:/etc/nginx/html - ../node_modules:/node_modules depends_on: - php php: build: context: ./lde/php-fpm volumes: - ./www:/var/www/html db: image: mysql:8.0 restart: always volumes: - ./db:/var/lib/mysql environment: MYSQL_USER: root MYSQL_ROOT_PASSWORD: toor MYSQL_DATABASE: expense adminer: image: adminer:4.8.1 restart: always ports: - 8080:8080
访问localhost:8080进入Adminer登录页,输入以下信息:
System: MySQL Server: db Username: root Password: toor Database: expense //我已通过命令行手动创建该数据库
但出现错误:Access denied for user 'root'@172.18.0.3 (using password: YES),其中172.18.0.3是Adminer在Docker桥接网络中的IP。
MySQL容器ID为b0b1e,我可通过docker exec -it b0b1e mysql -u root登录MySQL,但使用docker exec -it b0b1e mysql -u root -p并输入密码toor时,会报错:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
问题原因及解决方法
1. 错误的环境变量配置
你在db服务中错误设置了MYSQL_USER: root:
- MySQL官方镜像里,
MYSQL_USER是用来创建普通用户的,root用户是默认内置的。同时设置MYSQL_USER=root和MYSQL_ROOT_PASSWORD会导致root用户的权限、密码配置混乱,这就是你不用密码能通过本地socket登录,但输入密码反而被拒绝的核心原因。
2. 持久化卷的旧数据残留
你挂载了./db:/var/lib/mysql目录持久化数据库数据,第一次启动容器时生成的用户配置已经保存在这个目录中,后续修改环境变量不会覆盖旧的配置数据,导致新的密码设置无法生效。
解决步骤
第一步:修正docker-compose.yml配置
修改db服务的环境变量,删除多余的MYSQL_USER: root,保留以下配置:
db: image: mysql:8.0 restart: always volumes: - ./db:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: toor MYSQL_DATABASE: expense
第二步:清理旧的持久化数据
因为之前的./db目录已经存在混乱的用户配置,需要先清理:
- 停止并删除所有相关容器:
docker-compose down - 删除本地的
db目录(如果有重要数据请先备份):rm -rf ./db
第三步:重新启动容器
docker-compose up -d
第四步:验证登录
- 容器内登录验证:执行
docker exec -it <你的MySQL容器ID> mysql -u root -p,输入密码toor即可正常登录。 - Adminer登录验证:使用Server为
db,用户名root,密码toor,数据库expense即可正常访问。
内容的提问来源于stack exchange,提问作者Yu Zhang
相关产品推荐
相关产品推荐

