DockerによるMySQL構築

## この記事何？

- [Docker Official Image](https://hub.docker.com/_/mysql)の補足的な記事
- DockerでMySQL構築を初めてやってみたので、色々と調べてみました。
- 一度理解してしまえば、MySQLのインストールもバージョン変更も数分で終わってしまうので非常に便利だなーと感じました。

## Dockerのダウンロード

Docker Desktop (Mac)をここからインストールする
https://docs.docker.com/docker-for-mac/install/

## config-file.cnfの作成

config-file.cnfに設定を記載しておくことで、コンテナの起動時にこの設定通りに起動してくれます。

```bash:config-file.cnf
$ mkdir -p ~/docker/mysql/custom
$ mkdir ~/docker/mysql/data
$ vi ~/docker/mysql/custom/config-file.cnf
[mysqld]
sql_mode= STRICT_TRANS_TABLES
character_set_server=utf8mb4
collation_server=utf8mb4_bin
table_open_cache=400
skip_character_set_client_handshake

[client]
default_character_set=utf8mb4
```

- sql_mode=STRICT_TRANS_TABLES
    - この設定は厳密モードとも呼ばれInsertやUpdateをした値がテーブルの指定に従っていない場合に，SQLの実行を中止します。MySQL5.6からはdefault設定とのことですが明示しておきます
- 文字コードを`utf8mb4`で統一しておきます。

### コンテナの起動

```bash:起動コマンド
$ docker run --name test_mysql -v ~/docker/mysql/custom:/etc/mysql/conf.d -v ~/docker/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e MYSQL_USER=test -e MYSQL_PASSWORD=test -e MYSQL_DATABASE=test -d -p 3306:3306 mysql:8.0.14
```

[runコマンドのリファレンスはこちら](http://docs.docker.jp/engine/reference/run.html)

- `--name`: コンテナ名称（test_mysql）
- `-v`: 
    - conf.d指定（~/docker/mysql/custom/config-file.cnf）
    - データ格納ディレクトリ指定（~/docker/mysql/data:/var/lib/mysql）
- `-e`: 環境変数
    - MYSQL_ROOT_PASSWORD: rootユーザーのパスワード
    - MYSQL_USER: 初期ユーザー
    - MYSQL_PASSWORD: 初期ユーザーのパスワード
    - MYSQL_DATABASE: 初期DB
- `-d`: バックグラウンドでコンテナを起動
- `-p`: ポートフォワード(ホスト側ポート:コンテナ側ポート)
    - [詳しくはこちら](http://docs.docker.jp/engine/userguide/networking/default_network/binding.html)

## コンテナ内のbashに接続する

コンテナの起動が終わったら、コンテナ内のbashに接続して正しく起動できたか確認します。

`-it test_mysql bash`は、`test_mysql`のコンテナでbashプロセスを新規で立ち上げ、それをホスト側から操作するという意味

```bash:環境変数の確認
$ docker exec -it test_mysql bash
# env
MYSQL_PASSWORD=test
HOSTNAME=af03bdcbfba9
MYSQL_DATABASE=test
MYSQL_ROOT_PASSWORD=root
PWD=/
HOME=/root
MYSQL_MAJOR=8.0
GOSU_VERSION=1.7
MYSQL_USER=test
MYSQL_VERSION=8.0.14-1debian9
TERM=xterm
SHLVL=1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
_=/usr/bin/env
```

```bash:文字コードの確認
# mysql -u root -p
mysql> show variables like '%char%';
+--------------------------+--------------------------------+
| Variable_name            | Value                          |
+--------------------------+--------------------------------+
| character_set_client     | utf8mb4                        |
| character_set_connection | utf8mb4                        |
| character_set_database   | utf8mb4                        |
| character_set_filesystem | binary                         |
| character_set_results    | utf8mb4                        |
| character_set_server     | utf8mb4                        |
| character_set_system     | utf8                           |
| character_sets_dir       | /usr/share/mysql-8.0/charsets/ |
+--------------------------+--------------------------------+
8 rows in set (0.00 sec)

mysql> show variables like '%coll%';
+-------------------------------+--------------------+
| Variable_name                 | Value              |
+-------------------------------+--------------------+
| collation_connection          | utf8mb4_bin        |
| collation_database            | utf8mb4_bin        |
| collation_server              | utf8mb4_bin        |
| default_collation_for_utf8mb4 | utf8mb4_0900_ai_ci |
+-------------------------------+--------------------+
4 rows in set (0.00 sec)

mysql> exit
Bye
# exit
```

## 疎通確認

`-p 3306:3306` の通りにコンテナへアクセスできるか確認します。
ここまで出来てれば、MySQLの準備完了です。

```
$ nc 127.0.0.1 -z 3306
Connection to 127.0.0.1 port 3306 [tcp/mysql] succeeded!
```

## MySQL接続する方法

`-h 127.0.0.1` を付ける必要があるので注意

```bash
$ mysql -u root -p -h 127.0.0.1
$ mysql -u test -p -h 127.0.0.1
```

## MySQLコンテナの停止

```bash
$ docker stop test_mysql
```

起動するときは、startコマンドで起動します

```bash
$ docker start test_mysql
```

## 参考

- https://hub.docker.com/_/mysql
- [DockerをMacにインストールする](https://qiita.com/kurkuru/items/127fa99ef5b2f0288b81)
- [Dockerコマンドメモ](https://qiita.com/curseoff/items/a9e64ad01d673abb6866)
- [Dockerとdocker-composeでMySQLを構築する](https://tomokazu-kozuma.com/build-mysql-with-docker-compose/)