Fork me on GitHub
0%

使用 Docker 运行 MySQL 服务

对于 MySQL 数据库,我们基本上都用得到,在工作上有些情况下不太想连云上的库,比如说网络比较慢,或者我们只是刚开始开发,还没来得及在云上建立数据库,这时候在本地跑一下 MySQL 服务也许比较方便,但是呢 MySQL 安装下来占的内存还是比较大的,像我们不是经常连本地的库开发的在本地电脑安装一个 MySQL 确实有点浪费空间了,再加上可能本来笔记本电脑内存就不是非常富余的情况下再去安装,实在是有些肉疼。

这时候我们就可以通过 Docker 启动一个 MySQL 容器来运行 MySQL 服务,在我们需要的时候启动容器就好,不需要的时候直接关了,这样就不用在本机上安装 MySQL,而且在需要别的软件的时候也可以通过 Docker 启动容器的方式去运行,这样我们自己的电脑就会看起来非常清爽,不会有各种软件充斥着你的电脑,专注我们正在做的事情。

首先,我们需要在本地安装 Docker,Docker 的安装很简单,可以在这里 https://www.docker.com/get-started 下载对应系统的 Docker 软件进行安装,安装完毕之后,就可以从 Docker Hub 上拉取相应的镜像了。Docker Hub 网站是 Docker 提供的一项服务,主要用于查找和共享容器镜像,有点类似于 GitHub,不同的是 GitHub 维护的主要是代码,而 Docker Hub 维护的是主要是容器镜像。
声明: 由于我本地环境是 Mac 环境,下面命令和软件都是基于 Mac 下运行的。
安装好了之后可以在终端运行下面的命令看看是否安装成功:

1
docker --version

如果打印出了 Docker 的版本信息就可以了。接下来继续执行 docker images 命令查看本地有哪些镜像:

1
docker images

如果刚安装,之前没有从网站拉过镜像的话,打印出来的镜像应该是空的,我这里是已经拉过一些镜像了。由于我们要运行 MySQL,我们需要从 Docker Hub 上拉取 mysql-server 镜像, 执行一下命令拉取 mysql-server 的最新版镜像:

1
docker pull mysql/mysql-server

这时候如果你们没有配置镜像源地址的话,默认是国外的地址,会觉得很慢,这个我们可以通过配置国内的镜像源来解决。
打开 preferences -> Docker Engine, 在右边配置框里面加上国内镜像源的配置,然后 Apply & Restart ,待重启完毕后,可以执行下面的 docker info 命令验证是否添加成功:

1
docker info

上面的第一行是我在阿里云里面申请的一个镜像地址,这个自己注册了阿里云账号的话也可以去申请一个,后面两个分别是国内的科大和网易的镜像源:

1
2
https://docker.mirrors.ustc.edu.cn/
https://hub-mirror.c.163.com/

添加成功之后再去终端执行 docker pull mysql/mysql-serve 命令会感觉拉取速度快了许多。待镜像下载完毕之后就可以根据镜像来启动容器了:

1
docker run -d -p 3307:3306 --name mysql-service mysql/mysql-server

执行完命令之后,如果执行成功应该会有很长一串的 ID 打印出来,这是启动的容器 ID,后期可以通过这个 ID 来对容器执行启动,停止,重启,删除,查看日志,进入容器等一些列操作。我们可以通过 docker ps 命令来查看本地正在运行的容器:

1
docker ps

可以看到 STATUS 那一栏,health 状态处于 starting 状态,待状态变成 healthy 之后,说明容器启动完成,接下来就可以使用了,不过我们是不是还不知道 mysql 的 root 连接密码,我们需要通过查看容器的启动日志得到:

1
docker logs 1d0da81a71ec 2>&1 | grep GENERATED

执行命令之后可以看到容器启动的日志中生成了一个密码,不过这个密码只是一个临时的密码,通过这个密码连接到数据库之后,还是需要修改密码之后才能继续操作数据库。

1
2
docker exec -it 1d0da81a71ec mysql -uroot -p
ALTER USER 'root'@'localhost' IDENTIFIED BY 'root';

上面我们是通过进入到容器内执行 mysql 命令连接 MySQL 服务,如果想要在宿主机上连接容器内的 MySQL 服务,首先需要配置 root 用户能够通过 IP 进行远程连接,连上数据库修改 root 用户的 host 字段。

1
2
3
4
use mysql;
select user, host from mysql.user;
update user set host='%' where user='root';
flush privileges;

修改成功之后就可以在宿主机上通过 IP 以及映射到宿主机的端口号连接容器内的 MySQL 数据库了。

1
mysql -h 127.0.0.1 -P 3307 -uroot -p

到这里我们发现有个问题就是,每次启动之后需要查看日志获取密码,其实我们可以通过参数 -e MYSQL_ROOT_PASSWORD=password 来指定 root 用户的密码,这样我们就不用启动后再去查看日志获取密码,以及需要修改密码之后才能继续操作数据库。

1
docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root --name mysql-service mysql/mysql-server

这时候如果我们使用完了停掉了容器或者删除了容器,下次如果还想启动,就会发现之前创建的数据库结构都没了,我们又得重新执行一遍数据库的创建脚本,再次构造数据,如果一次两次还好,如果经常要用的话,每次都这样做的话就显得太傻了。

有一种办法就是我们把容器内的保存数据的目录挂载到宿主机上,这样就可以避免容器删除了,容器内的数据也随着没了,只要在启动的时候加上 -v 参数指定要挂载的目录即可,这里注意我在末尾添加的 mysqld –lower_case_table_name=0 这一串参数,这是我在挂载数据目录后运行报错了,应该是跟我的目录包含大写字母的目录有关,和配置文件里面指定的不一样,需要加上后面那一串指定 mysql 区分表名大小写:

1
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -v /Users/zhouxh/docker/mysql/data:/var/lib/mysql --name mysql-container mysql/mysql-server mysqld --lower_case_table_names=0

这样执行完之后再连上数据库创建的数据库表结构就会保存到宿主机上,不会随着容器的销毁而销毁。这样就实现了在我们想要连本地库时,启动容器即可,不想用了,停止或者删除容器都没关系,库里面的数据都已经保存在宿主机上了,下次启动时只要挂载对应的目录即可。

到这里,就基本上实现了通过 Docker 来运行 MySQL 服务的功能了,和本地安装一个 MySQL 使用的区别不是很大,并且也很方便。类似的,nginx 服务,各种队列(rabbitMq,rocketMq,kafka),或者我们只是想做一个临时的测试,需要用到某个环境,我们都可以通过指定相应环境的镜像来启动容器的方式来做。

 wechat
扫描上面图中二维码关注微信公众号