docker安装mysql8.0,并挂载数据卷

一、安装mysql8.0:

1. 在宿主机中创建目录,并编写自定义配置文件
# 1.创建文件夹
mkdir /mydata/mysql/conf
​
# 2.进入到新建的目录中
cd /mydata/mysql/conf
​
# 3.编写配置文件:文件名任意,但需以.cnf结尾
# 如我,此处编写了 custom.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

编写自定义配置文件的原因

在创建mysql8的docker容器时:进入容器你会发现,在/etc/目录下有my.cnf的文件,在这个文件中最后一行是!includedir /etc/mysql/conf.d/ ,意思是,在 /etc/mysql/conf.d/ 目录下新建自定义的配置文件[文件名].cnf也会被读取到,而且还是优先读取的(Docker Hub中的MySQL教程文档有说到)。【我们在后边创建容器的时候,会进行数据卷挂载,挂载到/etc/mysql/conf.d/目录】

而mysql8的默认编码会出现中文乱码,所有我们需要设置一下外部的配置文件,如果有什么优化mysql的也可以再此设置

2. 创建一个带数据卷的mysql容器
docker run -p 3306:3306 -v /mydata/mysql/conf/conf.d:/etc/mysql/conf.d -v /mydata/mysql/data:/var/lib/mysql -v /mydata/mysql/logs:/logs -e MYSQL_ROOT_PASSWORD=123456 -e TZ=Asia/Shanghai --name mysql8.0 -d mysql:8.1
3. 查看对应的目录是否生成了文件
ls /mydata/
​
ls /mydata/mysql/data/
​
vim /mydata/mysql/conf # 第一次跑起来的容器,查看conf里边是空的
ls /mydata/mysql/conf

docker安装mysql8.0,并挂载数据卷_第1张图片

4. 测试Navicat是否能够连接

docker安装mysql8.0,并挂载数据卷_第2张图片

发现连接失败

5. 进入容器中
docker exec -it 883850e8013b /bin/bash
​
# 进入容器内的数据库
mysql -uroot -p

docker安装mysql8.0,并挂载数据卷_第3张图片

# 查看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';
​
# 刷新
flush privileges;

docker安装mysql8.0,并挂载数据卷_第4张图片

备注:host为 % 表示不限制ip localhost表示本机使用 ;plugin非mysql_native_password 则需要修改密码

注:阿里云远程数据库状态下,别设置为localhost。

不然,用Navicat连接时会报一个,什么什么ip不允许连接

6. 测试连接,发现连接成功

docker安装mysql8.0,并挂载数据卷_第5张图片

# 重启一下容器
docker restart mysql8.0
​
# 再次测试,发现还是连接成功
7.改密码
# 进入容器:
docker exec -it 883850e8013b /bin/bash
​
#修改密码
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '要修改的密码';
​
# 删除host等于localhost的user
DELETE FROM mysql.user WHERE user = 'root' AND host = 'localhost';
​
# 刷新
FLUSH PRIVILEGES;

8. 开机自启
docker update mysql8.0 --restart=always

mysql8.0容器名

二、出现以下问题:

问题一:1038端口问题

1)网上说是端口没有开放,但是我的阿里云服务器确实开发了3306端口

docker安装mysql8.0,并挂载数据卷_第6张图片

2)如果你不确定你是否开启了,你可以用mysql5版本的来测试一下

docker run -it -p 3310:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql5.7 -d mysql:5.7

把容器跑起来后,去用Navicat去连接,发现可以连上 —— 说明你的端口是开放的,什么防火墙没开啊,阿里云端口没开啊,都是扯蛋!!!

问题二:1251加密方式问题

# 查看用户和加密方式
select host,user,plugin,authentication_string from mysql.user;

docker安装mysql8.0,并挂载数据卷_第7张图片

# 修改加密方式为:mysql_native_password
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
​
# 生效
FLUSH PRIVILEGES;

docker安装mysql8.0,并挂载数据卷_第8张图片

问题三:1062

MySQL执行命令:

UPDATE user SET host = '%' WHERE user = 'root';

报错:

ERROR 1062 (23000): Duplicate entry '%-root' for key 'user.PRIMARY'

# 查看所有用户
select user,host from user;
发现有两个root

docker安装mysql8.0,并挂载数据卷_第9张图片

 # 删除host等于localhost的那一个
 DELETE FROM user WHERE user = 'root' AND host = 'localhost';
 
 # 此时,下边的命令也不必执行了,因为它执行完,就是你删除完后的
 # UPDATE user SET host = '%' WHERE user = 'root';

docker安装mysql8.0,并挂载数据卷_第10张图片

# 生效【但我没使用也成功了】
FLUSH PRIVILEGES;

你可能感兴趣的:(docker,容器,运维,mysql)