You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Docker容器内MySQL root用户登录失败,请求解决方法

解决Docker中MySQL 5.7登录被拒绝的问题

问题分析

从你的配置和错误信息来看,核心问题出在docker-compose.yml的环境变量设置上:你同时指定了MYSQL_USER: rootMYSQL_ROOT_PASSWORD——在MySQL官方Docker镜像中,MYSQL_USER是用来创建一个新的普通用户的,而root是默认存在的超级用户,把普通用户设为root会导致镜像初始化时的逻辑冲突,最终导致root用户的密码配置异常,出现登录拒绝的错误。

临时解决方法(无需重新创建容器)

如果你不想重新构建容器,可以通过以下步骤重置root密码,快速恢复登录:

  1. 先停止当前MySQL容器:
    docker stop db
    
  2. 启动一个跳过权限验证的临时容器(复用原数据卷):
    docker run -d --name db-temp -p 3360:3306 -v dbdata:/var/lib/mysql mysql:5.7.22 --skip-grant-tables
    
  3. 进入临时容器并免密登录MySQL:
    docker exec -it db-temp bash
    mysql -u root
    
  4. 在MySQL命令行中重置root用户的本地登录密码:
    USE mysql;
    UPDATE user SET authentication_string=PASSWORD('password') WHERE User='root' AND Host='localhost';
    FLUSH PRIVILEGES;
    EXIT;
    
  5. 清理临时容器并重启原容器:
    docker stop db-temp
    docker rm db-temp
    docker start db
    
  6. 现在重新进入容器登录就能成功了:
    docker exec -it db bash
    mysql -u root -p
    # 输入密码password即可进入mysql命令行
    

正确的docker-compose配置方案

为了避免后续再出现类似问题,修改你的db服务环境变量,移除冲突的MYSQL_USER: root(如果需要普通权限用户,可以设置一个非root的用户名,比如laravel_user):

db:
  image: mysql:5.7.22
  container_name: db
  restart: unless-stopped
  tty: true
  ports:
    - "3360:3306"
  environment:
    MYSQL_DATABASE: laravel_db
    # 移除MYSQL_USER: root,或替换为普通用户名
    MYSQL_USER: laravel_user
    MYSQL_PASSWORD: user_password
    MYSQL_ROOT_PASSWORD: password
    SERVICE_TAGS: dev
    SERVICE_NAME: mysql
  volumes:
    - dbdata:/var/lib/mysql
    - ./DockerDevelopment/mysql/my.cnf:/etc/mysql/my.cnf
  networks:
    - app-network

修改完成后,重新部署容器(建议先备份数据):

# 可选:备份现有数据
docker run --rm -v dbdata:/var/lib/mysql -v $(pwd)/backup:/backup busybox tar cvf /backup/mysql-backup.tar /var/lib/mysql

# 停止并移除原容器
docker-compose down

# 重新启动容器
docker-compose up -d

之后你既可以用root用户登录管理数据库,也可以用设置的普通用户laravel_user进行日常操作。

补充说明

  • MySQL 5.7中,用户密码存储在authentication_string字段,而非旧版本的password字段,这是重置密码时需要注意的细节。
  • 如果你不需要额外的普通用户,完全可以直接移除MYSQL_USERMYSQL_PASSWORD这两个环境变量,只保留MYSQL_ROOT_PASSWORDMYSQL_DATABASE即可满足Laravel的连接需求。

内容的提问来源于stack exchange,提问作者Majid Alaeinia

火山引擎 最新活动