Docker安装MySQL5.7
为什么要在docker中安装mysql?
在docker中安装mysql可以随时启动另外的mysql服务端用于测试或者其他用途,缺点就是比较消耗资源,不过资源随时都能申请得到,毕竟世界加钱可及。
安装docker
可以参考我的这一篇文章:初探docker(一) | 个人随想 (fly97.cn)
安装MySQL容器
以官方的MySQL5.7为例:Mysql - Official Image | Docker Hub
首先确保docker服务已经正常启动:
linux执行:
1 | sudo service docker start |
笔者的系统是mac,因此打开Docker Destop即可。
拉取镜像
拉取镜像前需要使用docker login登陆docker
hub,这里以MySQL5.7为例:
1 | docker pull mysql:5.7 |
运行容器
1 | docker run --name mysql-5.7 \ |
其中:
-v参数是挂载本地文件到容器内部,/var/lib/mysql是mysql默认的数据文件保存路径;/etc/mysql/conf.d是附加配置目录,该目录下的.cnf文件都会被读取并覆盖原有的配置;-e参数是为容器指定环境变量,MYSQL_ROOT_PASSWORD为容器指定密码,容器预设的环境变量可以在这里查看:Docker Hub;- 最后的参数是指定字符集为utf8mb4,避免遇到mysql无法存放中文字符的问题。
- 查看当前数据库支持的字符集:
show variables like '%char%';
- 查看当前数据库支持的字符集:
设置MySQL容器
配置文件
1 | [client] |
允许外网访问
先进入容器
1 | docker exec -ti mysql-5.7 /bin/bash |
输入密码,连接mysql
1 | mysql -uroot -p |
修改表项
1 | update mysql.user set host='%' where user='root'; |
查看修改后的结果
1 | SELECT USER,HOST FROM mysql.user; |
结果如下所示,说明修改成功
1 | mysql> SELECT USER,HOST FROM mysql.user; |
导出表结构和表数据
导出整个数据库结构和数据
1
mysqldump -h localhost -uroot -p123456 database > dump.sql
导出单个数据表结构和数据
1
mysqldump -h localhost -uroot -p123456 database table > dump.sql
导出整个数据库结构(不包含数据)
1 | mysqldump -h localhost -uroot -p123456 -d database > dump.sql |
- 导出单个数据表结构(不包含数据)
1 | mysqldump -h localhost -uroot -p123456 -d database table > dump.sql |
- 导入sql文件
1 | mysql -uroot -p123456 < dump.sql |
设置日志路径
1 | [mysqld] |
使用docker-compose.yml
废话不多说直接上干货
1 | version: '1' |
后记
权限问题
由于一些原因需要把mysql容器中的日志映射出来,但是在操作的时候遇到了以下问题:

根据一些“高人博客”的指点,在Dockerfile做了以下修改:
1 | FROM mysql:5 |
上述指令的含义是将容器中的 /var/log/mysql
目录的所有者的用户和用户组修改为容器的内置用户mysql:mysql
仍旧失败,经过一翻查找,发现了原因,这里就不贴原文了,大致意思是:
容器中的/var/log/mysql这个目录一旦被映射到宿主机,Dockerfile中的命令就对它失去了作用
问题的根本原因在于,容器中的mysql用户没有写/var/log/mysql目录的权限,所有才会出现Permission denied.
换一个思路,既然容器中的mysql用户没有写/var/log/mysql目录的权限,那么找一个有权限的文件写不就好了吗?
于是将日志文件夹设置为/tmp/mysqlog不就可以正常读写了吗?/tmp目录下应该所有用户都有相关权限吧。
一顿操作以后,又发现了问题:
映射出来的文件,我本地用户竟然无法读写!!竟然需要root用户才可以读写!
经过查找,发现了问题所在:
mysql容器运行的用户是mysql,uid是999,而本地创建的默认用户uid是1000。换句话说,映射出来的文件的所有者不是你,是容器中的uid为999的用户!!
解决方案
将映射文件夹的所有者修改为999(uid),所在用户组修改为1000(uid),用户组也可以更改为当前目录下的用户名。
1 | sudo chown -R 999:1000 * |