使用Vagrant + Virtual Box创建Linux虚拟机,在Linux虚拟机上使用Docker安装MySQL5.7和MySQL8.0.23
贴一下创建MySQL容器实例的命令(可以根据自己需要进行编辑,此处命令参数在我的另一篇博客ElasticSearch的学习笔记并整合SpringBoot做测试的【二-2创建实例】中也有详细解释)
docker run -p 5030:3306 --name mysql8 \
-v /mydata/mysql8/log:/var/log/mysql \
-v /mydata/mysql8/data:/var/lib/mysql \
-v /mydata/mysql8/mysql-files:/var/lib/mysql-files \
-v /mydata/mysql8/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:8.0.23
--name mysql8 表示为MySQL镜像起个名字为mysql8; -p 5030:3306 暴露端口,将本机(宿主机)的5030端口映射到容器的3306端口 -v /mydata/mysql8/log:/var/log/mysql
-v是进行挂载,相当于将容器中MySQL中的所有配置,跟外部虚拟机创建的配置文件进行一一关联,以后修改外部的就相当于修改容器内的文件 -e MYSQL_ROOT_PASSWORD=root 设置MySQL的root用户密码为root #-d mysql:8.0.23 最后-d后台程序运行mysql:8.0.23镜像启动MySQL
前三张cmd终端截图基于Linux虚拟机中已经安装好Docker并且docker pull了MySQL5.7与MySQL8.0.23镜像的情况下。
1、如果出现2003或者1130的错误,先确保一下MySQL容器是否成功建立或者MySQL容器建立后是否开启,可能造成建立失败的原因下面有提。
我在创建MySQL8.0.23版本的容器的命令中,有一条 -v /mydata/mysql8/mysql-files:/var/lib/mysql-files,这边需要注意,/var/lib/mysql-files这个文件夹也同样需要挂载到Linux服务器中,不然会有报错,导致MySQL8.0.23容器创建失败
docker logs mysql8 #查看日志,mysql8为你自定义的容器名,不一定跟我一样
2、出现上图2058报错的原因是因为MySQL8版本开始,用户默认认证方式或者密码认证插件为caching_sha2_password,需要修改成mysql_native_password(具体可以登录MySQL查看mysql库中的user表)
因此增加数据库配置文件为
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-name-resolve
default_authentication_plugin= mysql_native_password # 默认使用“mysql_native_password”插件认证
!!改完配置记得重启MySQL服务
实在不行,删除容器、卸载镜像重新尝试,一定能行!我尝试了n次,大大小小基本上错误都出现了,例如修改用户表中root用户权限、密码、修改配置文件...
其实最终目的就是修改root用户密码认证插件为mysql_native_password,因此最好一开始保证配置文件/mydata/mysql8/conf/my.cnf设置了default_authentication_plugin= mysql_native_password
如果不想改配置的话也可以尝试在mysql.user表中修改root用户的密码验证方式及其密码
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码';注意
localhost与%,下面会提到
以下放上我用到的一些命令,希望能对同样遇到这些问题的土拨鼠们/doge有所帮助
vi /mydata/mysql8/conf/my.cnf #新建配置表并编辑内容
#按i进入插入模式进行编辑,按esc退出插入模式进入普通模式,按冒号进入命令行模式,输入wq保存并关闭
docker images #查看docker镜像
docker ps #查看docker容器
docker rm mysql8 [-f] #卸载docker容器
docker rmi 镜像id [-f] #卸载docker镜像
#卸载命令加上-f就能强制卸载运行中的镜像或者容器
docker exec -it mysql8 bash #进入MySQL服务容器
#随后就可以登录MySQL
mysql -uroot -p
use mysql; #进入mysql数据库
select * from user; #查看用户信息
注释内容就不要复制上去了,下同!
——————如果仍有连接不上的报错,可尝试一下——————
进入MySQL服务容器后,登录MySQL,并修改允许远程访问
docker exec -it mysql8 bash
mysql -uroot -p
GRANT ALL ON *.* TO 'root'@'%' with grant option;
flush privileges; #刷新mysql的系统权限相关表,不能忘
GRANT ALL ON *.* TO 'root'@'%' with grant option这句赋予权限的命令执行之后,可能会报错You are not allowed to create a user with GRANT,原因大致为mysql.user表中root用户的host属性值不是%,当host属性值为localhost时表示只能连接访问本地IP上的MySQL
update user set host='%' where user='root'; #修改root用户的host属性值为"%"
mysql.user表中Host为"%"的含义:
-- Host列指定了允许用户登录所使用的IP,比如user = root, Host = 192.168.1.1。这里的意思就是说root用户只能通过192.168.1.1的客户端去访问。 -- 而%是个通配符,如果Host = 192.168.1.%,那么就表示只要是IP地址前缀为"192.168.1."的客户端都可以连接。如果Host = %,表示所有IP都有连接权限。 -- 这也就是为什么在开启远程连接的时候,大部分人为了省事,都会直接把Host改成"%"的缘故。
docker exec -it mysql8 bash
mysql -uroot -p
update user set host='%' where user='root';
GRANT ALL ON *.* TO 'root'@'%' with grant option;
flush privileges;
贴一个挺详细的MySQL用户权限参考知识点:MySQL用户权限(Host,User,Password)管理(mysql.user)
如有错误之处或有补充,欢迎评论区分享指出!谢谢! 转载请贴明出处,另外,唐牛才是食神