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
2
3
4
5
6
7
8
9
10
11
12
13
14
docker run --name mysql-5.7 \
-v /Users/wf09/develop/mysql/data:/var/lib/mysql \
-v /Users/wf09/develop/mysql/conf:/etc/mysql/conf.d \
-p 3306:3306 \
-d -e MYSQL_ROOT_PASSWORD=adminadmin \
mysql:5 \
--character-set-server=utf8mb4 \
--character_set_connection=utf8mb4 \
--character_set_client=utf8mb4 \
--character_set_results=character_set_results \
--collation-server=utf8mb4_unicode_ci \
--collation_connection=utf8mb4_unicode_ci


其中:

  • -v参数是挂载本地文件到容器内部,/var/lib/mysql是mysql默认的数据文件保存路径;/etc/mysql/conf.d是附加配置目录,该目录下的.cnf文件都会被读取并覆盖原有的配置;
  • -e参数是为容器指定环境变量,MYSQL_ROOT_PASSWORD为容器指定密码,容器预设的环境变量可以在这里查看:Docker Hub
  • 最后的参数是指定字符集为utf8mb4,避免遇到mysql无法存放中文字符的问题。
    • 查看当前数据库支持的字符集:show variables like '%char%';

设置MySQL容器

配置文件

1
2
3
4
5
6
7
8
[client]
default-character-set=utf8mb4

[mysql]
default-character-set=utf8mb4

[mysqld]
character-set-server=utf8mb4

允许外网访问

先进入容器

1
docker exec -ti mysql-5.7 /bin/bash

输入密码,连接mysql

1
mysql -uroot -p

修改表项

1
2
update mysql.user set host='%' where user='root';
flush privileges;

查看修改后的结果

1
SELECT USER,HOST FROM mysql.user;

结果如下所示,说明修改成功

1
2
3
4
5
6
7
8
9
10
mysql> SELECT USER,HOST FROM mysql.user;
+---------------+-----------+
| USER | HOST |
+---------------+-----------+
| root | % |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+---------------+-----------+
4 rows in set (0.00 sec)

导出表结构和表数据

  1. 导出整个数据库结构和数据

    1
    mysqldump -h localhost -uroot -p123456 database > dump.sql
  2. 导出单个数据表结构和数据

    1
    mysqldump -h localhost -uroot -p123456  database table > dump.sql
  3. 导出整个数据库结构(不包含数据)

1
mysqldump -h localhost -uroot -p123456  -d database > dump.sql
  1. 导出单个数据表结构(不包含数据)
1
mysqldump -h localhost -uroot -p123456  -d database table > dump.sql
  1. 导入sql文件
1
mysql -uroot -p123456 < dump.sql

设置日志路径

1
2
3
4
5
6
7
8
9
10
11
12
13
[mysqld]
# 错误日志
log_error = /var/log/mysql/error.log
# 查询日志
general_log = 1
general_log_file = /var/log/mysql/general.log
# 慢查询日志
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
# 同步写binlog
log_bin_index = /var/log/mysql/bin
max_binlog_size = 4M
sync_binlog = 1

使用docker-compose.yml

废话不多说直接上干货

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
version: '1'
services:
mysql:
image: mysql:5
container_name: mysql
restart: always
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD=ff143253-f1dd-266f-2a4b-cdb747c31150
- TZ=Asia/Shanghai
volumes:
- ./mysql/conf:/etc/mysql/conf.d
- ./mysql/data:/var/lib/mysql
- ./mysql/sql:/root/sql

后记

权限问题

由于一些原因需要把mysql容器中的日志映射出来,但是在操作的时候遇到了以下问题:

根据一些“高人博客”的指点,在Dockerfile做了以下修改:

1
2
FROM mysql:5
RUN chown -R mysql:mysql /var/log/mysql

上述指令的含义是将容器中的 /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 *