You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 04:50:17