DockerでMySQLを動かす(気を付けるべきところとかいろいろ)

引き続きMySQLについて。DockerでMySQLを動かす場合は、いろいろと工夫が必要です。結構その辺躓いたので、メモ。

# MySQLを使う際の注意点

DockerでMySQLを使う場合、注意すべきことは

 * Dockerfileでは、複数行にまたがってサービスやプロセスの状態が保持されない(毎回サービスプロセスがすべて終了した扱いになる)
 * MySQLは`apt-get`でインストールしただけではインストールが終わらない(インストールスクリプトの実行が必要)

とくに厄介なのが一つ目です。MySQLでの処理(ユーザーの追加やパスワードの設定、初期テーブルの登録など)はMySQLのサービスが起動した状態でしか操作できませんので、Dockerfileだけでは処理が行えません(複数のコマンドを&&で連結して処理することも可能ですが、Dockerfileの可読性が下がりますし、見た目にもかっこよくないですね)。

# Dockerfile
で、Dockerfileです。今回は別のスクリプトからの抜粋ですので初期処理については割愛します。

```Dockerfile:Dockerfile
# mysql
RUN apt-get -q -y install mysql-server

# mysql
ADD mysql/charset.cnf /etc/mysql/conf.d/
RUN mysql_install_db
RUN chown -R mysql:mysql /var/lib/mysql
ADD mysql/startup.sh /startup.sh
RUN chmod 755 /startup.sh
RUN ./startup.sh
```

```cnf:mysql/charset.cnf
[client]
default-character-set=utf8

[mysqld]
skip-character-set-client-handshake
character-set-server = utf8
collation-server = utf8_general_ci
init-connect = SET NAMES utf8
```

```mysql/startup.sh(charset.cnf)
#!/bin/bash
service mysql start
mysql -uroot -e "CREATE USER [ユーザー名]@ IDENTIFIED BY '[パスワード]'"
mysqladmin -u root password '[rootユーザーのパスワード]'
```

## Dockerfileのポイント
今回のポイントは次の通りです。

 * MySQLの設定ファイルについて
 * スタートアップ処理を行うシェルスクリプト(mysql_install_db)について
 * インストールスクリプトについて(startup.sh)

### MySQLの設定ファイルについて
MySQLの設定ファイル(*.cnf)について、この段階でもし構文エラーがあったとしても、エラーメッセージなどが一切表示されません(ここはかなりハマった)。自信がないときはまずコンフィグファイルをひとつも入れないなどして工夫すると良いでしょう。

## スタートアップ処理を行うシェルスクリプトについて
冒頭に書いたように、Dockerfileでは複数行にまたがった処理がかけません。データベース初期化に関する処理を全部一行で書かなければいけません。

それでは面倒くさいので、ここではシェルスクリプトを使いました。シェルスクリプトの最初で`service mysql start`などとしてMySQLを起動しておけば、スクリプト内では直接データベースの処理を行うことができます(直後にsleepを挟むなどして起動完了待ちをした方がいいのかもしれない)。

## インストールスクリプトについて

最後はインストールスクリプトについて。MySQLではインストール完了後、別にインストール用のスクリプトを使用する必要があります。それが、`mysql_install_db`です。これを使った後でないと、どのような処理もかならず失敗するようになっているので注意。


とりあえずこれで、MySQLが使えるようになります。早速テストしてみましょう。`docker exec-it [コンテナ名] bash`などでコンテナにログインし、mysqlコマンドを実行してみます。

```実行内容

> mysql -u root -p
Enter password: [パスワードを入力]
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 41
Server version: 5.5.41-0ubuntu0.14.04.1 (Ubuntu)

Copyright (c) 2000, 2014, 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> select Host,User,Password from mysql.user;
+--------------+------------------+-------------------------------------------+
| Host         | User             | Password                                  |
+--------------+------------------+-------------------------------------------+
| localhost    | root             | [パスワード]                               |
| f4f502dce15c | root             |                                           |
| 127.0.0.1    | root             |                                           |
| ::1          | root             |                                           |
| localhost    | debian-sys-maint | [パスワード]                               |
|              | dbuser           | [パスワード]                               |
+--------------+------------------+-------------------------------------------+
6 rows in set (0.00 sec)
```
これでMySQLのセットアップは完了です。