(一)引言
MySQL是开源数据库。凭借其可靠性、易用性和性能,MySQL已成为Web应用程序的数据库优先选择。
(二)docker搭建Mysql
1、查看可用的 MySQL 版本
访问MySQL镜像库地址:Docker Hub 。
此外,我们还可以用 docker search mysql 命令来查看可用版本:
[root@icoolkj ~]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 12687 [OK]
mariadb MariaDB Server is a high performing open sou… 4864 [OK]
percona Percona Server is a fork of the MySQL relati… 579 [OK]
...
[root@icoolkj ~]#
2、拉取 MySQL 镜像
这里拉取官方的最新版本的镜像:
[root@icoolkj ~]# docker pull mysql:latest
3、查看本地镜像
使用以下命令来查看本地镜像:
[root@icoolkj ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql latest 65b636d5542b 8 days ago 524MB
sonatype/nexus3 latest aab1398bb647 2 weeks ago 705MB
[root@icoolkj ~]#
REPOSITORY:来自哪一个仓库,比如ubuntu仓库
TAG:镜像的标签信息,最新的
IMAGE ID:镜像的id号:这个是唯一的
CREATED:镜像创建时间
SIZE:镜像大小
在上图中可以看到我们已经拉取最新版本(latest)的 mysql 镜像。
4、运行容器(建立目录映射)
docker run -p 3306:3306 --name mysql-test \
-v /usr/local/docker/mysql/mysql-files:/var/lib/mysql-files \
-v /usr/local/docker/mysql/conf:/etc/mysql \
-v /usr/local/docker/mysql/logs:/var/log/mysql \
-v /usr/local/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:latest
5、安装成功
通过docker ps命令查看是否安装成功:
[root@icoolkj ~]# docker ps
可以看到容器ID,容器的源镜像,启动命令,创建时间,状态,端口映射信息,容器名字
(三)连接mysql
1、进入docker本地连接mysql服务
## 进入mysql容器
[root@icoolkj ~]# docker exec -it ecc75bf3bd65 /bin/bash
## 访问mysql服务
root@ecc75bf3bd65:/# mysql -h localhost -u root -p123456
2、使用远程连接软件连接mysql服务
(四)问题处理
1、问题一
a)问题描述
在使用Docker部署 mysql8.0 并登录用户的时候报错:
Access denied for user 'root'@'localhost' (using password: YES)
b)问题分析处理
Access denied : 拒接访问数据库
using password: YES : YES 表示密码输入正确 / 当NO 时表示密码错误
其中最大的原因就是因为密码输入不正确,请认真检查输入的密码是否与容器启动时设置的是否一致。
如果确认明文密码是正确的,请参考如下解决:
通过Docker启动命令设置了root的密码(MYSQL_ROOT_PASSWORD=123456),但是登录的时候一直显示错误(Access denied for user ‘root’@‘localhost’ (using password: YES))。
如果确认明文密码是正确的,原因有可能是mysql8.0使用的默认加密插件是 caching_sha2_password 而非5.6的 mysql_native_password,当你在控制台使用明文密码登录的时候走的是mysql_native_password加密,而数据库记录的是caching_sha2_password加密后的密码,匹配自然不正确。
#my.cnf 文件的存放路径根据自己需求自定义即可
vim /usr/local/docker/mysql/conf/my.cnf
#编辑内容 在vi编辑器中输入以下内容
[mysqld]
default_authentication_plugin=mysql_native_password
#保存并退出vi编辑器
#停止早期mysql容器,重新启动
docker run -p 3306:3306 --name mysql-test \
-v /usr/local/docker/mysql/mysql-files:/var/lib/mysql-files \
-v /usr/local/docker/mysql/conf/my.cnf:/etc/mysql/my.cnf \
-v /usr/local/docker/mysql/logs:/var/log/mysql \
-v /usr/local/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:latest
2、问题二
a)问题描述
容器运行正常,本地客户端可以访问,但是远程无法访问到MySQL。
b)问题分析处理
需要进入docker本地客户端设置远程访问账号。
## 进入mysql容器
[root@icoolkj ~]# docker exec -it d5223c1f0afc bash
## 进入mysql
root@d5223c1f0afc:/# mysql -uroot
## 打开mysql库
mysql> use mysql
## 允许使用root账户连接的ip为任意
mysql> update user set host='%' where user='root';
## 刷新权限
mysql> flush privileges;
mysql>
## 如果前面步骤没有报错且刷新权限了还是不可以远程连接,就重新启动数据库。
3、问题三
a)问题描述
进入Navicat连接MySQL出现下面的2059界面。
b)问题分析处理
mysql8之前版本中加密规则为mysql_native_password,mysql8以后的加密规则为caching_sha2_password,将mysql用户登录加密规则修改为mysql_native_password即可!
mysql> use mysql;
mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
mysql> flush privileges;