docker-composeでmysql8サーバーを立ち上げてみた。

# 導入
今回も新しいことを発信しません。（えっへん）
どちらかというみなさんがやってきたことを自分なり再現、ブリコラージュした内容となります。
というよりも備忘録と手順書のような感じです。

記述きっかけは、新人用にSQLを気軽に遊びる用にするにはどうすればいいんだろうと思った際、環境構築は手頃にできるのとローカルを汚さず
手頃に構築できるdocker（dockerの知識はいりますが）を使ってやればいいじゃないと思い構築しました。
また、docker-composeファイルに環境変数をどうやって紐づけるのかという方法も解説しています。

# 導入時の環境
docker-compose 1.29.2
mysql: 8.0.30

# ファイル準備
今回用意したファイルはgithub上にあるのでクローンしてみてください。
[ここ](https://github.com/shitobe/mysql-docker-compose)においてます。

```bash
git clone git@github.com:shitobe/mysql-docker-compose.git
```
# ファイルの中身の概要

+ /db
    + /initdb.d
        + world.sql
    + my.cnf
+ /docker
    + .env
    + docker-compose.yml

### docker-compose.ymlの説明
```yml:docker-compose.yml
version: '3'
services:
    mysql:
        image: mysql:8.0.30
        container_name: mysql_local
#        env_fileは環境変数を使う前に宣言した方がいいかも
        env_file:
            - .env
        environment:
            MYSQL_ROOT_PASSWORD: "${MYSQL_ROOT_PASSWORD}"
            TZ: 'Asia/Tokyo'
        ports:
            - 3306:3306
        volumes:
            - ./db/my.cnf:/etc/mysql/conf.d/my.cnf
            - ../db/initdb.d/:/docker-entrypoint-initdb.d/
#            永続化する際には、以下のように書くといいかも。
#            - "${MYSQL_DATA_PATH}:/var/lib/mysql"
```

`image: mysql:8.0.30`
公式のmysqlイメージを今回活用しています。ちょっと個人的には大きいイメージに感じますが、一番手っ取り早い。
より軽量にするには、alpineなどを活用するといい気がしますが、時短です。


`container_name: mysql_local`
コンテナネームは、各自で決めてください。私は、とりあえずlocalかわかればなんでもいい派

`env_file: .env`
同じディレクトリ内のenvを読み込んでいる。
envは以下にしているが任意に変更するとdocker-compose時に自動で紐づいてdockerコンテナを作成できる。
```shell:.env
MYSQL_ROOT_PASSWORD=root
MYSQL_DATA_PATH=~/data/
```

`environment:`
`MYSQL_ROOT_PASSWORD: "${MYSQL_ROOT_PASSWORD}"`
`TZ: 'Asia/Tokyo'`
environmentに.envの環境変数を紐づけている。

`ports:`
`- 3306:3306`
ポートの構成は、host側のポートを叩くとコンテナ側のポートを紐づけてくれているというイメージでいいと思います。詳しくは[こちら](https://qiita.com/tksugimoto/items/23fcce1b067661e8aa46)を参考にしています。

`volumes:`
`- ./db/my.cnf:/etc/mysql/conf.d/my.cnf`
`- ../db/initdb.d/:/docker-entrypoint-initdb.d/`
dbディレクトリ内にある、my.cnfとinitdb.dをコンテナ内にマウントさせている。
紐付けている状態なので、ローカル内でmy.cnfをいじると自動的にdocker内のファイルも更新するというイメージでお願いします。
また、環境変数を入れる場合は、
`- "${MYSQL_DATA_PATH}:/var/lib/mysql"`というふうに、ダブルクオートで括ると使えます。

### my.cnfの説明

```:my.cnf
[mysqld]
character-set-server=utf8mb4

[mysql]
default-character-set=utf8mb4

[client]
default-character-set=utf8mb4
```
すべてutf8mb4にしている。

### initdb.dの説明
この中には、mysql公式にあるテストsqlデータが入っています。
[MySQL公式サンプルデータ](https://dev.mysql.com/doc/index-other.html)

これをinitdb.dに入れておくと自動でDBとして取り込んでくれます。

### docker-compose up してみよう。
ここまで準備できたら、クローンしたディレクトリ内に入って以下のコマンドを打ってみよう。

```shell
docker-compose up -d
```

```
Creating mysql_local ... done
```
↑のようになれば、docker-composeは作られてさらにコンテナとして起動している。

### 実際に中身が観れるか確認してみよう。

では試しに接続してみよう。
ソフトは基本一緒だが[tablepluss](https://tableplus.com)にする。

ちなみに業務では、DataGripを使ってますけどね。

Sequel Proはdocker + mysql8は入れないっぽい。


以下TablePlusの操作例
##### 1　TablePlusを起動しよう
![「docker-composeでmysqlサーバーを立ち上げてみた。」を編集_-_Qiita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516317/1ac5a602-66d9-8f7b-5da2-91efd848d01e.png)

##### ２　MySqlを選択して、Create
![スクリーンショット_2022_08_20_13_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516317/e517c277-ee6e-7756-cff7-cbfb87750391.png)

##### 3　以下の様に入力してください。Passwordはrootが入っています。
![Connection____と_「docker-composeでmysqlサーバーを立ち上げてみた。」を編集_-_Qiita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516317/5f3910a2-588a-163c-8bc5-ff44a3fc455d.png)
##### ４　テーブルが選択できていないので、アイコンをクリック
![mysql-local_-_MySQL_8_0_30_と_Connection___.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516317/e53a71c8-bd82-49ae-b80d-acf274d4317c.png)
##### 5　worldテーブルを選択しよう。
![mysql-local_-_MySQL_8_0_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516317/1524131b-4845-7eef-eb00-3a8284e5c11e.png)
##### 6　SQLを叩いてデータが取れるか確認してみよう。
+ SQLをクリック
+ SQLを入力してください。
```sql
SELECT *
FROM world.country
where name='Japan';
```
+ Run Currentをクリック
+ 成功すると1行表示表示されます。
以下の画像のような形で表示されると思います。
![mysql-local___world_-_MySQL_8_0_30_と_Connection___.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516317/01da3877-1a38-ad4c-4c05-85affd994ca2.png)


### 終わり
こんな感じで表示できたら成功です。
SQLの部分は結構自由に書いて試してSQLに慣れてほしいです。
SQLは業務上使う機会は必ずあります。これに慣れてORMに適応できる様に、なればなかなかの即戦力になれると思います。
ORMだけでも楽しい世界です。自分も苦しみ楽しみ成長したいと思っています。