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)" }
错误分析
密码本身是正确的,问题出在两个核心点:
- MySQL 8.0 默认采用
caching_sha2_password认证插件,mysql2库对该插件的兼容性有限,容易触发认证失败; - 默认情况下,MySQL的root用户仅允许从
localhost发起连接,你的Node应用运行在另一容器(IP为172.18.0.2),属于远程连接,被默认权限规则拒绝。
修改方案
方案1:启用原生认证插件并开放root远程访问
修改docker-compose.yml中mysql-server的配置:
- 取消
command行注释,强制使用mysql_native_password认证插件; - 进入容器手动授权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
相关产品推荐
相关产品推荐

