查看可用的 MySQL 版本
访问 MySQL 镜像库地址:https://hub.docker.com/_/mysql?tab=tags 。
可以通过 Sort by 查看其他版本的 MySQL,默认是最新版本 mysql:latest 。
此外,我们还可以用 docker search mysql 命令来查看可用版本:
1 | root@localhost ~]# docker search mysql |
拉取 MySQL 镜像
这里我们拉取官方的最新版本的镜像:
1 | docker pull mysql:latest |
1 | Trying to pull repository docker.io/library/mysql ... |
查看本地镜像
1 | docker images |
1 | [root@localhost ~]# docker images |
运行容器
安装完成后,我们可以使用以下命令来运行 mysql 容器:
1 | docker run -itd --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql |
参数说明:
-p 3306:3306 :映射容器服务的 3306 端口到宿主机的 3306 端口,外部主机可以直接通过 宿主机ip:3306 访问到 MySQL 的服务。
MYSQL_ROOT_PASSWORD=123456:设置 MySQL 服务 root 用户的密码。
安装成功
通过 docker ps 命令查看是否安装成功:
1 | [root@localhost ~]# docker ps |
本机可以通过 root 和密码 123456 访问 MySQL 服务。
1 | root@e5f364c8eea5:/# mysql -h localhost -u root -p |
问题:
1 | [root@localhost ~]# mysql -h localhost -u root -p |
办法
1 | [root@localhost ~]# docker exec -it e5f364c8eea5 bash |
用客户端navicat测试连接提示
1 | navicat for mysql 链接时报错:1251-Client does not support authentication protocol requested by server |
主要原因是mysql服务器要求的认证插件版本与客户端不一致造成的。
打开mysql命令行输入如下命令查看,系统用户对应的认证插件:
1 | mysql> select user,plugin from mysql.user |
可以看到root用户使用的plugin是caching_sha2_password,mysql官方网站有如下说明:
caching_sha2_password是8.0默认的认证插件,必须使用支持此插件的客户端版本。
plugin的作用之一就是处理后的密码格式和长度是不一样的,类似于使用MD5加密和使用base64加密一样对于同一个密码处理后的格式是不一样的.
解决方法:
1 | root的plugin改成mysql_native_password。相当于降了一级。 |
1 | mysql> select user,plugin from mysql.user ; |
没有生效还是其他原因?重启容器之后还是不行。
发现刚刚修改的是localhost,对于非本机的连接密码校验规则还是没有变。
1 | mysql> select user,plugin ,host from mysql.user ; |
1 | alter user 'root'@'%' identified by 'password' password expire never; |
1 | mysql> select user,plugin ,host from mysql.user ; |