DockerにてMySQLをpullして起動 初回SQLの読み込み データの永続化

Dockerをinstall後にMySQLイメージをpullして起動 初回SQLの読み込みにとデータの永続化までに行なったことのメモです。

## Dockerのinstall
[公式サイト](https://www.docker.com/)よりGet Docker fot Macをクリックしてinstallします。

## サンプル用のディレクトリ作成
Dockerのinstall後にサンプル用ディレクトリを作り移動します。

```
$ mkdir sample
$ cd sample
$ ls
```

現状lsしても何も表示されません。

## MySQLイメージをpull
今回は[docker-compose](https://docs.docker.com/compose/)にてpullなどを行います。
`docker-compose.yml`というファイルを作成し以下の様に記載し`$ docker-compose up`で起動します。

```sample/docker-compose.yml
version: '2'
services:
  db:
    image: mysql:5.6
    ports:
      - "8888:3306"
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: test
      MYSQL_USER: root
      MYSQL_PASSWORD: root
```

MYSQL_ROOT_PASSWORDなどはお好きな値を設定します。
MYSQL_DATABASEに設定した名前でデータベースが作成されます。

```
$ docker-compose up
Starting sample_db_1
Attaching to sample_db_1
...
```

起動する際に以下の様なエラーが出た場合は`docker-compose.yml`の`MYSQL_USER: 値`を削除すると上手く起動します。
既に存在するユーザー名を設定した場合にエラーが出るようです。

```
PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
To do so, start the server, then issue the following commands:
...
```

変更後`MYSQL_USER: 値`を削除

```sample/docker-compose.yml
version: '2'
services:
  db:
    image: mysql:5.6
    ports:
      - "8888:3306"
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: test
      MYSQL_PASSWORD: root
```

## MySQLにログイン
`$ docker-compose up`したまま、別のターミナルなどでログインしてみます。
`$ docker ps`で起動しているコンテナのIDを取得してログインします。

```
$ docker ps
CONTAINER ID IMAGE
xxxxx     mysql:5.6 

$ docker exec -it xxxxx(CONTAINER IDの値) bash
root@xxxxx(CONTAINER IDの値):/# mysql -u root -p
Enter password: 設定したパスワードを入力

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
```

`MYSQL_DATABASE:`に設定したデータベースが作成されています。

## 初回SQLの読み込み
初回のみSQLを読み込みするようsqlディレクトリ以下にsample.sqlを追加し`docker-compose.yml`に設定を加えます。

```
sample/
  ├ sql/
  │  └ sample.sql
  └ docker-compose.yml
```

```sample/sql/sample.sql
use test;
CREATE TABLE user (id int);
```

`volumes:`部分に`- "./ディレクトリ:/docker-entrypoint-initdb.d"`を指定します。
指定したディレクトリ以下にある`.sql`などを読み込んでくれます。
今回はsql以下にある`sample.sql`を読み込みます。

```sample/docker-compose.yml
version: '2'
services:
  db:
    image: mysql:5.6
    volumes:
      - "./sql:/docker-entrypoint-initdb.d"
    ports:
      - "8888:3306"
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: test
      MYSQL_PASSWORD: root
```

```
$ docker-compose up
別ターミナルでMySQLにログイン
mysql> show tables from test;
+----------------+
| Tables_in_test |
+----------------+
| user           |
+----------------+
```

## データの永続化
今までの状態でテーブルにデータを追加したり削除しても、`$ docker-compose down`してしまったらデータが消えてしまいます。

永続化するために`docker-compose.yml`に設定を加えます。

```sample/docker-compose.yml
version: '2'
services:
  db:
    image: mysql:5.6
    volumes:
      - "./db:/var/lib/mysql"
      - "./sql:/docker-entrypoint-initdb.d"
    ports:
      - "8888:3306"
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: test
      MYSQL_PASSWORD: root
```

`"./ディレクトリ:/var/lib/mysql"`を加えることでデータの永続化が出来ます。
今回の場合は

```
sample/
  ├ sql/
  │  └ sample.sql
  └ docker-compose.yml
```
の状態から設定した`db`ディレクトリが作成され以下にデータベースの`test`などのディレクトリが自動的に作成されます。

```
sample/
  ├ sql/
  │  └ sample.sql
　　　　├ db/
  │  └ mysql/
  │  └ performance_schema/
  │  └ test/
  └ docker-compose.yml
```