使用Docker构建的MySQL容器

2018-08-27T06:44:11

1457

0

0

#### 本文主要讲解如何利用Docker来运行MySQL容器

## 下载镜像

![title](/static/files/591/5989cee6e519f50ef7000031/19/images/75b24607fc227c55ec8931a393482598.png)

拉取MySQL官方镜像只需要执行如下命令即可:

```bash

docker pull mysql:5.7.21

```

默认情况下,会拉取mysql的latest版本。

Ps:目前对应为5.7.21版本。

## 运行镜像

### 基本使用

```bash

docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

```

其中,`some-mysql`表示自己定义的容器名称。`my-secret-pw`是我们设置的ROOT用户的密码,`tag`是我们对应的镜像版本,默认为latest。

当我们启动容器后,可以通过如下方式进行终端命令行:

```

docker exec -it some-mysql bash

```

同时,我们可以使用如下命令来查看MySQL容器的日志:

```

docker logs some-mysql

```

### 指定MySQL配置文件

在MySQL中,启动配置文件默认为:`/etc/mysql/my.cnf`。

此外,在`/etc/mysql/conf.d`文件夹下任意以`.cnf`结尾的文件都会被认为是MySQL的配置文件。

因此,如果我们想要指定一个MySQL的配置文件,我们只需要在主机中创建一个以`.cnf`结尾的文件,并在宿主机中该文件所在的文件夹映射到Docker容器中`/etc/mysql/conf.d`文件夹即可。

假设在宿主机中存在如下配置文件:`/my/custom/config-file.cnf`。那么,我们在启动容器时只需要执行如下命令即可:

```

docker run --name some-mysql -v /my/custom:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

```

Ps:其中,`-v`表示了卷映射。

此外,当配置信息相对较少时,我们不希望编写一个完整的配置文件,而是仅仅希望在命令行中添加一些配置参数即可:

```

docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

```

### MySQL中的一些环境变量

- MYSQL_ROOT_PASSWORD
- MYSQL_DATABASE
- MYSQL_USER
- MYSQL_PASSWORD
- MYSQL_ALLOW_EMPTY_PASSWORD
- MYSQL_RANDOM_ROOT_PASSWORD
- MYSQL_ONETIME_PASSWORD

### 初始化容器

当我们第一次启动容器时,可以令其启动执行一些`.sh`,`.sql`,`.sql.gz`的文件,前提是这些文件存放在容器的`/docker-entrypoint-initdb.d`目录下。对于SQL文件的执行,则会在我们环境变量中指定的`MYSQL_DATABASE`中执行。

### 数据持久化

在使用MySQL的容器时,数据持久化有很多种方式,下面我们将描述一种推荐的方式:

在宿主机上创建一个数据存储目录,并将其映射到容器中的目录中。

这将数据库文件放在主机系统中的已知位置,并便于主机系统上的工具和应用程序访问文件。

缺点是用户需要确保目录存在,例如,主机系统上的目录权限和其他安全机制配置正确。

使用方法如下:

1. 在宿主机中创建一个目录,例如`/my/own/datadir`。

2. 如下命令启动容器:

```bash

docker run --name some-mysql -v /my/own/datadir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

```

### 已存在数据库服务的启动

当数据库中已经有数据存在时,在启动时,我们要省略传入`MYSQL_ROOT_PASSWORD`,此时,已有的数据库不再会被修改。

### 数据库备份

通常情况下,我们需要对数据库进行备份。

数据库备份的方式如下:

```bash

docker exec some-mysql sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > /some/path/on/your/host/all-databases.sql

```

## 推荐用法

执行如下命令拉取MySQL镜像:

```

docker pull mysql

```

创建MySQL专用的文件夹:

```
cd /mnt
mkdir mysql
cd ./mysql
mkdir conf
mkdir data
cd ./conf
touch config-file.cnf
```

修改`config-file.cnf`如下:

```bash
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
character-set-server = utf8mb4
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
```

执行如下命令启动MySQL:

```bash

docker run --name mysql -p 3306:3306 -v /mnt/mysql/data:/var/lib/mysql -v /mnt/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql

```

执行如下命令进行数据库备份:

```bash

DATE=$(date +%Y%m%d)

docker exec mysql sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > /mnt/mysql/backup/mysql$DATE.sql

```