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

Docker-Compose中MySQL root用户访问拒绝问题及配置修改方案

解决MySQL容器连接访问拒绝问题

问题重现

docker-compose.yml 配置

version: '3'
services:
  mysql-server:
    container_name: mysql8
    restart: always
    image: mysql:8.0
    #command: mysqld --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    environment:
      MYSQL_ROOT_PASSWORD: dummypassword
      #MYSQL_DATABASE: dbname
      #MYSQL_USER: root
      #MYSQL_PASSWORD: dummypassword
#      MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
    ports:
      - '3306:3306'
    volumes:
      - './docker/db/data:/var/lib/mysql'
  node-app:
    build: .
    ports:
      - "8080:8080"
volumes:
  my-datavolume:

Node.js 数据库连接代码

pool = mysql.createPool({
  user: DBUser, // <---- root
  password: DBPassword, // <--- dummypassword
  host: 'mysql-server',//DBHost,
  database: DBName,
});

错误信息

"error": {
            "message": "Access denied for user 'root'@'172.18.0.2' (using password: YES)",
            "code": "ER_ACCESS_DENIED_ERROR",
            "errno": 1045,
            "sqlState": "28000",
            "sqlMessage": "Access denied for user 'root'@'172.18.0.2' (using password: YES)"
        }

错误分析

密码本身是正确的,问题出在两个核心点:

  1. MySQL 8.0 默认采用 caching_sha2_password 认证插件,mysql2库对该插件的兼容性有限,容易触发认证失败;
  2. 默认情况下,MySQL的root用户仅允许从localhost发起连接,你的Node应用运行在另一容器(IP为172.18.0.2),属于远程连接,被默认权限规则拒绝。

修改方案

方案1:启用原生认证插件并开放root远程访问

修改docker-compose.yml中mysql-server的配置:

  1. 取消command行注释,强制使用mysql_native_password认证插件;
  2. 进入容器手动授权root用户的远程访问权限。

修改后的mysql-server配置片段:

mysql-server:
  container_name: mysql8
  restart: always
  image: mysql:8.0
  command: mysqld --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
  environment:
    MYSQL_ROOT_PASSWORD: dummypassword
    # 可选:提前初始化目标数据库
    MYSQL_DATABASE: dbname
  ports:
    - '3306:3306'
  volumes:
    - './docker/db/data:/var/lib/mysql'

执行以下命令授权root远程访问:

# 进入MySQL容器
docker exec -it mysql8 mysql -uroot -pdummypassword

# 允许root从任意IP访问所有数据库
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'dummypassword' WITH GRANT OPTION;

# 刷新权限使配置生效
FLUSH PRIVILEGES;

方案2:创建专用应用用户(推荐,更安全)

避免使用root用户,创建一个仅用于Node应用的数据库用户,符合最小权限原则。

修改docker-compose.yml的environment部分,添加专用用户配置:

mysql-server:
  container_name: mysql8
  restart: always
  image: mysql:8.0
  command: mysqld --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
  environment:
    MYSQL_ROOT_PASSWORD: dummypassword
    MYSQL_DATABASE: dbname
    MYSQL_USER: appuser
    MYSQL_PASSWORD: apppassword
  ports:
    - '3306:3306'
  volumes:
    - './docker/db/data:/var/lib/mysql'

同步修改Node.js连接配置:

pool = mysql.createPool({
  user: 'appuser',
  password: 'apppassword',
  host: 'mysql-server',
  database: 'dbname',
});

注意事项

如果之前已经启动过容器并生成了数据卷(./docker/db/data),需要先清理旧数据再重启,否则新的初始化配置不会生效:

# 停止并删除容器及关联数据卷
docker-compose down -v

# 重新启动服务
docker-compose up -d

内容的提问来源于stack exchange,提问作者H.C

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 11:21:10