前言
很久以前在Docker上搭建MySQL8的时候就遇到了一些棘手的小问题,当时没有记录下来,今天重新在Docker上搭建MySQL时再次遇到了这些问题,特别头疼,弄了许久,现在已经是凌晨两点。虽已夜深,但还是要坚持记录之后才准备入睡,以免下次再次遇到如此问题继续头疼,也为了遇到类似问题的程序猿朋友快速解决。
一、获取MySQL
执行命令: docker pull mysql 下载最新版的mysql,标签为mysql:lastest
二、运行MySQL容器
执行命令: docker run -p 3306:3306 --name mysqltest -v $PWD/conf:/etc/mysql/conf.d -v $PWD/logs:/logs -v $PWD/data:/var/lib/mysql --privileged=true -e MYSQL_ROOT_PASSWORD=123456 -d mysql
命令说明:
-p 3306:3306:将容器的 3306 端口映射到主机的 3306 端口。
-v -v $PWD/conf:/etc/mysql/conf.d:将主机当前目录下的 conf/my.cnf 挂载到容器的 /etc/mysql/my.cnf。
-v $PWD/logs:/logs:将主机当前目录下的 logs 目录挂载到容器的 /logs。
-v $PWD/data:/var/lib/mysql :将主机当前目录下的data目录挂载到容器的 /var/lib/mysql 。
-e MYSQL_ROOT_PASSWORD=123456:初始化 root 用户的密码。
-d mysql :mysql是容器ID docker images查看 或者填容器名字亦可
执行以上命令时,需要进入已经创建好的目录中,并创建好conf、logs、data这三个文件夹的目录。
(这个目录一定要建好,进入,写对,不然下面进到MySQL的时候会报1045错误的,我就是在解决1045的错误的问题上卡了好久好久,回来冷静下来发现是前一步路径搞错了,然后把路径弄对就没有1045的错误了。)
这样MySQL容器已经运行起来了,但是因为某些问题(各种权限)还是无法访问的 ,用Navicat 连接会报1130错误 Host is not allowed to connect to this mysql server ,所以接下来就要来解决这些问题。
三、解决MySQL的报错
这些问题看似简单,但解决起来却很费劲,鄙人搜遍了百度,发现没有一个博主提供的解决方法能够一次性解决问题,需要几个博主提供的解决方案综合起来,才能解决,再次非常感谢几位大神的博文,在此我也总结一下,以方便其他的朋友遇到类似的问题时,能够快速解决。
(一)进入容器
执行命令:docker exec -it mysqltest bash 进入MySQL容器中
(二)登录MySQL
执行命令:mysql -u root -p
密码不用输入直接按回车键进入了
(三)修改MySQL的密码
执行命令: ALTER USER 'root'@'%' IDENTIFIED BY '123456' PASSWORD EXPIRE NEVER;
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password by '123456';
执行这两条命令之后,就可以正常使用MySQL了,但是在执行这两条语句之前,需要再配置一个东西,不然就会报错1396的错误。
(四)解决授权问题
-
# 使用mysql 数据库
-
mysql > use mysql;
-
# 特定用户的host 修改
-
mysql > update user set host='%' where user='root';
-
# 指定用户的授权
-
mysql > grant all privileges on test.* to root@'%';
执行完以上的这些命令,再执行第三部的两条语句,最后就大功告成了。
过程看似简单,做的时候可遇到不少困难,其中最大的两个难题:一是运行MySQL容器时老是闪退(原因在路径上。。。),二是MySQL权限上,运行后还不能直接访问,需要配置。之前探索的过程中错误码我见了五六个,一个个百度的,最后终于解决了。十点半看完CBA广东v北京的半决赛以后,搞到将近两点才搞定,写完这篇博客,已经是三点多了,格式有点难看,明天起来再调整,先提交,睡觉咯!
以下是我解决这个问题参考了这些大神的博文,特此附上以示感谢:
https://www.jianshu.com/p/71efd60edde8
https://blog.csdn.net/zhouzhiwengang/article/details/102909298