Docker-Compose部署MySQL后出现访问拒绝问题求助
解决MySQL 8.0.32 Docker部署后的连接权限问题
1. 先排查密码输入的问题
错误提示里的(using password: NO)说明你执行连接命令后,要么没输入密码就回车了,要么-p参数的用法不对。
- 正确操作:运行
mysql -u testuser -p -h 127.0.0.1 -P 3306后,等终端弹出Enter password:时输入密码(输入时不会显示字符,直接回车就行)。 - 嫌麻烦的话可以直接把密码贴在
-p后面(不推荐,密码会留在命令历史里):mysql -u testuser -pYourTestPassword -h 127.0.0.1 -P 3306,注意-p和密码之间不能有空格。
2. 检查docker-compose.yml的用户配置
MySQL官方镜像用环境变量创建用户时有固定格式,别写错了:
- 你的docker-compose.yml里应该有类似这样的配置:
environment: MYSQL_ROOT_PASSWORD: 你的root密码 MYSQL_USER: testuser MYSQL_PASSWORD: testuser的密码 MYSQL_DATABASE: 要创建的数据库名 - 要是你同时在Dockerfile的SQL文件里手动创建了testuser,环境变量创建的用户可能被覆盖,得优先看SQL文件里的配置。
3. 修正SQL文件里的用户权限语句
MySQL 8.0+对用户的host限制很严,如果你在SQL文件里手动创建testuser,得给对连接权限:
- 别写这种(只能通过本地socket连接,不能用127.0.0.1的TCP连接):
CREATE USER 'testuser'@'localhost' IDENTIFIED BY '密码'; GRANT ALL ON 你的数据库.* TO 'testuser'@'localhost'; - 改成允许127.0.0.1连接的版本:
CREATE USER 'testuser'@'127.0.0.1' IDENTIFIED BY 'testuser的密码'; -- 要是需要从其他机器连,就把127.0.0.1换成%(生产环境别随便用) -- CREATE USER 'testuser'@'%' IDENTIFIED BY 'testuser的密码'; GRANT ALL PRIVILEGES ON 你的数据库.* TO 'testuser'@'127.0.0.1'; FLUSH PRIVILEGES; - 要是连接时还报认证错误,就指定用旧的认证插件:
CREATE USER 'testuser'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY 'testuser的密码';
4. 进容器里直接查用户权限
直接登进容器里的MySQL,看看用户配置到底对不对:
- 先进入容器:
docker exec -it 你的MySQL容器名 bash - 用root登MySQL:
mysql -uroot -p,输入root密码 - 查用户列表:
看看testuser对应的host是不是127.0.0.1或者%SELECT user, host, plugin FROM mysql.user; - 再查权限:
SHOW GRANTS FOR 'testuser'@'127.0.0.1'; - 要是用户不存在或者权限不对,直接在容器里补全:
CREATE USER IF NOT EXISTS 'testuser'@'127.0.0.1' IDENTIFIED BY 'testuser的密码'; GRANT ALL PRIVILEGES ON 你的数据库.* TO 'testuser'@'127.0.0.1'; FLUSH PRIVILEGES;
5. 彻底清理数据卷重置
之前的docker-compose rm -v可能没清干净数据卷,试试彻底重置:
- 停掉并删除容器和数据卷:
docker-compose down -v - 删除镜像:
docker rmi 你的MySQL镜像名 - 重新构建启动:
docker-compose up --build -d - 注意:这会把所有数据库数据清掉,先确认没重要数据再操作。
内容的提问来源于stack exchange,提问作者Camille
相关产品推荐
相关产品推荐

