说明
以下都是在本地虚拟机中操作。关于防火墙相关配置,我这里并不严谨;不要学我。
系统、工具等版本
系统版本:CentOS7
docker版本:26.1.4
镜像仓库:阿里云个人镜像-https://*****.mirror.aliyuncs.com/ (不知道的,可以去阿里云官网或客服查一下,免费的)
实操开始
准备镜像
# 拉取镜像
docker pull mysql:8.0
# 查询镜像
docker images
在宿主机中创建目录,并编写自定义配置文件
mkdir -p /usr/local/mydata/mysql/conf
cd /usr/local/mydata/mysql/conf
# 3.编写配置文件:文件名任意,但需以.cnf结尾
vim custom.cnf
# 文件内容如下:【作用-在linux系统中查看数据库内容出现中文乱码】
[mysqld]
init-connect="SET collation_connection=utf8mb4_0900_ai_ci"
init_connect="SET NAMES utf8mb4"
skip-character-set-client-handshake
# 最后:wq保存退出即可;esc切换vim模式;输入i是写入模式
编写自定义配置文件的原因:
在创建mysql8的docker容器时:进入容器你会发现,在/etc/目录下有my.cnf的文件,在这个文件中最后一行是!includedir /etc/mysql/conf.d/ ,意思是,在 /etc/mysql/conf.d/ 目录下新建自定义的配置文件[文件名].cnf也会被读取到,而且还是优先读取的(Docker Hub中的MySQL教程文档有说到)。【我们在后边创建容器的时候,会进行数据卷挂载,挂载到/etc/mysql/conf.d/目录】
而mysql8的默认编码会出现中文乱码,所有我们需要设置一下外部的配置文件,如果有什么优化mysql的也可以再此设置
根据镜像创建容器并运行以及挂载内容
docker run -p 3306:3306 -v /usr/local/mydata/mysql/conf/conf.d:/etc/mysql/conf.d -v /usr/local/mydata/mysql/data:/var/lib/mysql -v /usr/local/mydata/mysql/logs:/logs -e MYSQL_ROOT_PASSWORD=123456 -e TZ=Asia/Shanghai --name mysql8.0 -d mysql:8.0
修改数据库部分配置;达到理想效果
# 查询镜像id,
docker ps
# 进入容器内
docker exec -it 5bbcbc5823a2 /bin/bash
# 进入数据库;执行命令后输入密码回车即可,密码是看不到的。启动容器是设置了密码:123456
mysql -uroot -p
123456 # 输入后回车即可
查看mysql数据库下的user表,结果如下
select host,user,plugin,authentication_string from mysql.user;
修改plugin为mysql_native_password,结果如下
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
# 其中有两个root,将host=localhost的删除
DELETE FROM mysql.user WHERE user = 'root' AND host = 'localhost';
# 刷新
FLUSH PRIVILEGES;
再次查看mysql数据库下的user表,结果如下
select host,user,plugin,authentication_string from mysql.user;
备注:host为 % 表示不限制ip localhost表示本机使用 ;plugin非mysql_native_password 则需要修改密码
如上图就是没问题了,然后退出,设置防火墙
# 退出数据库
exit;
# 退出容器 或使用:exit
Ctrl + p + q
# 查询开启的所有端口
firewall-cmd --list-port
# 设置3306端口开启
firewall-cmd --zone=public --add-port=3306/tcp --permanent
#重启
firewall-cmd --reload
# 验证3306端口是否开启成功 (单个端口查询)
firewall-cmd --zone=public --query-port=3306/tcp
然后就可以使用工具连接了:
我这里期间有一个报错:(如果使用腾讯云或阿里云购买的服务器,找到官网控制中心再配置一下端口规则就好了。)
我这里是将防火墙关闭后解决的;(有大佬如果知道问题原因,麻烦留言下。万分谢谢)
# 关闭防火墙(解决问题)
systemctl stop firewalld
#### 防火墙操作(以下不是步骤操作!!!!!!!这里是作为备忘录使用的,不要无脑执行。)
#检查防火墙是否开启
systemctl status firewalld
#开机自启防火墙
systemctl enable firewalld
#开机禁止自启防火墙
systemctl disable firewalld
#启动
systemctl start firewalld
#关闭
systemctl stop firewalld
#重启
firewall-cmd --reload