CentOS7之Docker构建MySql8.0.20(解决1251-client does not support authentication protocol requested by ser)

文章目录

一、构建mysql容器服务

1、拉取镜像

docker pull mysql:8.0.20

2、随便创建一个容器(目的只是为了拷贝挂载目录)

docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456  -d mysql:8.0.20

查看是否启动成功:

docker ps -a

CentOS7之Docker构建MySql8.0.20(解决1251-client does not support authentication protocol requested by ser)

3、启动成功后,进入容器内部拷贝配置文件,到宿主主机

docker cp  mysql:/etc/mysql /usr/software/docker_dir/mysql8.0.20_1

CentOS7之Docker构建MySql8.0.20(解决1251-client does not support authentication protocol requested by ser)
拷贝容器的 /etc/mysql 目录到宿主机目录 /usr/software/docker_dir/mysql8.0.20_1

4、删除mysql容器,重新创建容器

需要先停止容器,再删除容器

docker stop mysql

docker rm mysql

5、 重新创建mysql容器 ,挂载配置文件,数据持久化到宿主主机

docker run \
-p 3306:3306 \
--name mysql_1 \
--privileged=true \
--restart=always \
-v /usr/software/docker_dir/mysql8.0.20_1/mysql:/etc/mysql \
-v /usr/software/docker_dir/mysql8.0.20_1/logs:/logs \
-v /usr/software/docker_dir/mysql8.0.20_1/data:/var/lib/mysql \
-v /etc/localtime:/etc/localtime \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:8.0.20

命令解释:

  • -p 端口映射
  • –privileged=true 挂载文件权限设置
  • –restart unless-stopped 设置 开机后自动重启容器
  • -v /usr/software/docker_dir/mysql8.0.20_1/mysql:/etc/mysql 挂载配置文件
  • -v/usr/software/docker_dir/mysql8.0.20_1/logs:/logs 挂载日志
  • -v /usr/software/docker_dir/mysql8.0.20_1/data:/var/lib/mysql 挂载数据文件 持久化到主机
  • -v /etc/localtime:/etc/localtime 容器时间与宿主机同步
  • -e MYSQL_ROOT_PASSWORD=123456 设置密码
  • -d mysql:8.0.20 后台启动mysql

挂载分为文件挂载和目录挂载:

1、 文件挂载时,宿主机需要自己提前创建好文件,不然会出问题。自己不创建文件的话 执行完命令后会将它创建成目录

2、挂载目录时可以不自己创建目录,会根据目录的挂载路径将 容器内的目录下的文件夹拷贝过来
3、挂载成功后, 如果修改挂载文件的内容,容器内的文件不会实时更新,需要重启容器。如果修改的是挂载目录下的文件,则会实时更新,所以推荐挂载目录

查看容器是否启动成功

docker ps 

CentOS7之Docker构建MySql8.0.20(解决1251-client does not support authentication protocol requested by ser)

6、进入容器登录MySql服务

登录守护式容器方式:

docker exec -it mysql_1 bash

CentOS7之Docker构建MySql8.0.20(解决1251-client does not support authentication protocol requested by ser)

mysql -uroot -p

输入密码123456后成功登入mysql服务!

CentOS7之Docker构建MySql8.0.20(解决1251-client does not support authentication protocol requested by ser)
支持,mysql服务构建完成。

注意,此时数据库的配置、数据、日志等信息都挂载在宿主机上,我们可以查看一下:
CentOS7之Docker构建MySql8.0.20(解决1251-client does not support authentication protocol requested by ser)

7、远程Navicat连接测试

CentOS7之Docker构建MySql8.0.20(解决1251-client does not support authentication protocol requested by ser)
发现远程连接的时候出错了!因为默认情况下只允许本地连接。

8、开启远程登录

容器内连接到mysql客户端后,首先查看用户和可连接主机信息:

注意,当我用“select user,host from user;”查询的时候发现:
CentOS7之Docker构建MySql8.0.20(解决1251-client does not support authentication protocol requested by ser)
可以看到,root用户对应的host其实是localhost和%。这代表远程应该可以使用root用户连接到本服务才对!

所以下面的sql我们可以先不用执行。

use mysql;
update user set host='%' where user='root';
flush privileges;

我们来尝试修改root用户密码。

9、修改用户密码

我们再来执行下面的sql:

 select host,user,plugin,authentication_string from mysql.user;

CentOS7之Docker构建MySql8.0.20(解决1251-client does not support authentication protocol requested by ser)
备注:

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

这里挺奇怪的,root用户对应%的那一条消息的host和user好像乱码了。但是通过对比,我们应该还是可以确定这第一条列出的应当就是root ~ % 。所以,我们还是不需要修改远程登录的。

根据备注第三条plugin非mysql_native_password 则需要修改密码,我们尝试修改root用户密码(相当于还是改成原来的密码):

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456'; 

CentOS7之Docker构建MySql8.0.20(解决1251-client does not support authentication protocol requested by ser)
修改成功后我们再来查询:
CentOS7之Docker构建MySql8.0.20(解决1251-client does not support authentication protocol requested by ser)
发现上一次乱码的信息竟然变得正常了。而且此时root % 对应的plugin已经变成了mysql_native_password。

我们再次尝试使用Navicat连接:

CentOS7之Docker构建MySql8.0.20(解决1251-client does not support authentication protocol requested by ser)
可以看到,此时就可以正常连接成功了!!!

二、修改配置文件,测试目录挂载

修改my.cnf配置文件,打开binlog日志,以及指定severId。

[mysqld]
server-id=47
#开启binlog
log_bin=master-bin
log_bin-index=master-bin.index
skip-name-resolve
# 设置连接端口
port=3306
# 设置mysql的安装目录
# basedir=/usr/local/mysql
# 设置mysql数据库的数据的存放目录
# datadir=/usr/local/mysql/mysql-files
# 允许最大连接数
max_connections=200
# 允许连接失败的次数。
max_connect_errors=10
# 服务端使用的字符集默认为UTF8
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 默认使用“mysql_native_password”插件认证
#mysql_native_password
default_authentication_plugin=mysql_native_password

1、修改宿主机上的配置

我们首先进入到宿主机**/usr/software/docker_dir/mysql8.0.20_1/mysql** 目录下:
CentOS7之Docker构建MySql8.0.20(解决1251-client does not support authentication protocol requested by ser)
我们来修改my.cnf文件,再原来的配置文件后追加上面的内容:

vim my.cnf

CentOS7之Docker构建MySql8.0.20(解决1251-client does not support authentication protocol requested by ser)

2、重启容器

docker restart mysql_1

然后,我们需要给root用户分配一个replication slave的权限。

#登录主数据库
mysql -u root -p
GRANT REPLICATION SLAVE ON *.* TO 'root'@'%';
flush privileges;
#查看主节点同步状态:
show master status;

CentOS7之Docker构建MySql8.0.20(解决1251-client does not support authentication protocol requested by ser)

上一篇:liquibase shardingjdbc 不兼容


下一篇:量化交易之vnpy篇 - 主力合约换月 - 引擎调用部分