启动docker版mysql5.7后,容器输出日志一直报错如下:
[Note] Access denied for user 'root'@'localhost' (using password: NO)
通常第一次启动mysql时,会生成随机密码,这里我就不管有没有密码,以及是哪个密码,直接重置root密码。
一、重置mysql root密码
- 确定mysql读取了哪个配置文件,通常读取配置文件的顺序是:
/etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf
后面的配置文件会覆盖前面的配置文件(如果有的话),先进入容器:
docker exec -it mysql /bin/bash
# 查看上面的几个配置文件是否存在,实际上只有第一个配置文件存在
ls /etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf
- 设置跳过密码验证
按ctrl+d退出容器,复制配置文件并修改:
docker cp mysql:/etc/my.cnf ~/mysql.cnf
# 在[mysqld]下面添加一行内容:
# skip-grant-tables
vim ~/mysql.cnf
# 把文件拷贝回去,并进入容器查看是否添加成功
docker cp ~/mysql.cnf mysql:/etc/my.cnf
docker exec -it mysql /bin/bash
cat /etc/my.cnf | grep skip-grant-tables
- 重启mysql容器并重置密码
# ctrl+d退出容器
docker restart mysql
# 进入容器设置新密码
docker exec -it mysql /bin/bash
mysql -uroot
# 修改root密码
# 如果修改过程中报错,先退出mysql、退出容器,然后重启mysql:docker restart mysql,再重新进入容器
mysql> flush privileges;
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
# 创建用户并授权访问
mysql> CREATE USER 'nacos'@'localhost' IDENTIFIED BY '123456';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'nacos'@'localhost';
mysql> flush privileges;
- 去掉skip-grant-tables
# 退出mysql和容器
mysql> exit
exit
vim ~/mysql.cnf
# 注释掉skip-grant-tables
# 拷贝回去 并重启mysql容器
docker cp ~/mysql.cnf mysql:/etc/my.cnf
docker restart mysql
二、测试mysql连接
进入容器并执行如下命令:
docker exec -it mysql /bin/bash
# 登录mysql
mysql -uroot -p
Enter password: <-- 输入root密码