Configuring and Running MySQL 5.6.26 in Docker Container

# 概要

MySQLのOFFICIAL REPOSITORYで公開されているMySQL 5.6.26イメージからコンテナを作成、実行するまでの手順です。

**環境**

下記の環境で動作確認を行いました。

* Windows7 (64bit)
* [docker] (https://www.docker.com/) 1.8.1
 * MySQL 5.6.26

**参考**

下記のサイトを参考にさせて頂きました。

* [MySQL - OFFICIAL REPOSITORY] (https://hub.docker.com/_/mysql/)


## MySQL 5.6.26イメージの取得

```bash:pull
$ docker pull mysql:5.6.26
Pulling repository docker.io/library/mysql

...省略...

Status: Downloaded newer image for mysql:5.6.26
```

試しにイメージからコンテナを作成し実行します。

```bash:run
$ docker run -d --name my-mysql -e MYSQL_ROOT_PASSWORD=rootpw mysql:5.6.26
```

ログになにかエラーが出力されていないか確認します。

```bash:logs
$ docker ps --format="{{.ID}}"
a49349c94f7d

$ docker logs a49349c94f7d
```

コンテナ内にある既存のmy.cnfの内容を確認します。

```bash:exec
$ docker exec -it my-mysql bash

root@a49349c94f7d:/# cat /etc/mysql/my.cnf
```

```text:my.cnf
[client]
port            = 3306
socket          = /var/run/mysqld/mysqld.sock

[mysqld_safe]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
nice            = 0

[mysqld]
skip-host-cache
skip-name-resolve
user            = mysql
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
port            = 3306
basedir         = /usr
datadir         = /var/lib/mysql
tmpdir          = /tmp
lc-messages-dir = /usr/share/mysql
explicit_defaults_for_timestamp

# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
#bind-address   = 127.0.0.1

#log-error      = /var/log/mysql/error.log

# Recommended in standard MySQL setup
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

# * IMPORTANT: Additional settings that can override those from this file!
#   The files must end with '.cnf', otherwise they'll be ignored.
#
!includedir /etc/mysql/conf.d/
```

### 差分のmy.cnfの作成

差分の設定ファイルを作成します。
この設定ファイルは上記の既存my.cnfの`!includedir`で指定するディレクトリへ配置することで反映されます。

```text:my.cnf
[mysqld]
innodb_buffer_pool_size = 64M
innodb_file_per_table = 1
innodb-status-output = 1
innodb-status-output-locks = 1
default-storage-engine = innodb

log_bin = mysql-bin

port = 3306
server_id = 1

character-set-server = utf8
collation-server = utf8_general_ci

transaction-isolation = REPEATABLE-READ

# autocommit = 0
explicit_defaults_for_timestamp = true

lower_case_table_names = 1

# Logging
log_output = FILE
log_warnings = 1
log_error = /var/log/mysql/error.log
general_log = 1
general_log_file = /var/log/mysql/general_query_all.log
log-slow-admin-statements = 1
log-queries-not-using-indexes = 1
slow_query_log = 1
long_query_time = 1
slow_query_log_file = /var/log/mysql/slow_query.log

[mysql]
default-character-set = utf8
show-warnings
```

**差分設定ファイル**

差分の設定ファイル(my.cnf)は、WindowsPCと仮想マシン(ホスト)の共有フォルダ(%USERPROFILE%)下ではなく、それ以外のディレクトリに配置し、パーミッションを644に設定します。
共有フォルダに置くとファイルのパーミッションが777になり、このパーミッションではMySQLが参照してくれないためです。

共有フォルダに置くとパーミッションが777になり変えられません。

```bash
-rwxrwxrwx    1 docker   staff          747 Aug 31 14:30 my.cnf*
```

且つこの状態でMySQLを起動すると下記の警告メッセージがログに出力され差分の設定ファイルが反映されませんでした。

```text
Warning: World-writable config file ‘/etc/my.cnf’ is ignored
```

この記事では仮想マシンの/home/docker/mysqlディレクトリにmy.cnfを置き、このディレクトリをコンテナとマッピングします。

* host : `/home/docker/mysql`
* container : `/etc/mysql/conf.d`

```text:mapping
-v /home/docker/mysql:/etc/mysql/conf.d
```

**データディレクトリ**

データファイルを永続化するためデータディレクトリはWindowsPCとの共有フォルダ下に置きます。

* Windows : `%USERPROFILE%/dev/docker/mysql5.6.26/data`
* host : `/c/Users/username/dev/docker/mysql5.6.26/data`
* container : `/var/lib/mysql`

```text:mapping
-v /c/Users/username/dev/docker/mysql5.6.26/data:/var/lib/mysql
```

**ログディレクトリ**

ログファイルも一応永続化しておきます。
ログディレクトリはWindowsPCとの共有フォルダ下に置きます。

* Windows : `%USERPROFILE%/dev/docker/mysql5.6.26/logs`
* host : `/c/Users/username/dev/docker/mysql5.6.26/logs`
* container : `/var/log/mysql`

```text:mapping
-v /c/Users/username/dev/docker/mysql5.6.26/logs:/var/log/mysql
```

## コンテナの実行

上記の設定を元にコンテナを作成し実行します。
(上記で作成していたコンテナは削除しておきます。)

```bash
$ docker run -d --name my-mysql -p 3306:3306 -v /home/docker/mysql:/etc/mysql/conf.d -v /c/Users/username/dev/docker/mysql5.6.26/data:/var/lib/mysql -v /c/Users/username/dev/docker/mysql5.6.26/logs:/var/log/mysql -e MYSQL_ROOT_PASSWORD=rootpw mysql:5.6.26
```

なにか問題が発生していないかコンテナのログを確認します。

```bash
docker@default:~/mysql$ docker logs 140027f459b8
2015-08-31 16:00:15 0 [Note] mysqld (mysqld 5.6.26-log) starting as process 1...
```

### MySQL Clientコンテナから接続

実行中のMySQLコンテナへMySQL Clientコンテナから接続できるか確認します。

```bash
$ docker run -it --link my-mysql:mysql -v /home/docker/mysql:/etc/mysql/conf.d --rm mysql:5.6.26 sh -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"'
Warning: Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.6.26-log MySQL Community Server (GPL)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show variables like "char%";
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
```

### Windows版のMySQL Clientから接続

Windows版のMySQL Clientから接続できるか確認します。

```bat
> mysql.exe -h 192.168.99.100 -P 3306 -u root -p
Enter password: ******
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.26-log MySQL Community Server (GPL)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show variables like "char%";
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.01 sec)
```