DockerでMySQLを構築する


DokerでMySQLを使うことが多いので、設定方法などをメモします。
ソースコードは[GitHub🐱](https://github.com/hinahinako/docker-sample/tree/master/mysql)でも公開しています。

## 🌱 環境

- macOS Monterey 12.4
- docker-compose 1.29.2

## 🗂 ディレクトリ構成
```
mysql
  ├── README.md
  ├── docker-compose.yml
  └── sql
      ├── data
      ├── tmp
      ├── init
      └── myconf
          └── my.cnf
```

## 🐳 手順

### ① docker-compose.ymlファイルを用意

ルートディレクトリにdocker-compose-ymlを作成し以下をコピペします。

```yml:docker-compose.yml
version: "3.1"
services:
  my-mysql:
    image: mysql:8.0
    command: --default-authentication-plugin=mysql_native_password
    container_name: my-mysql
    volumes:
      # 永続化用のマウント先
      - ./sql/data:/var/lib/mysql
      # 初期データ
      # - ./sql/init/:/docker-entrypoint-initdb.d
      # my.cnf
      - ./sql/myconf/my.cnf:/etc/mysql/conf.d/my.cnf
    environment:
      MYSQL_USER: user
      MYSQL_PASSWORD: user
      MYSQL_ROOT_PASSWORD: pass
    ports:
      - "3306:3306"

```

解説
- `version`: docker-composeのバージョンです。
- `my-mysql`: このサービスの名前です。適当でOKです。
- `command`: 認証方法を設定しています。
- `container_name`: コンテナ名です。
- volumes:
  - `./sql/data`: コンテナを停止してもデータが消えないように`/var/lib/mysql`のデータを./sql/dataで保存するように設定しています。
  - `./sql/init/`: 初期データがあればここにおきます(今回はないのでコメントアウトです)。
  - `./sql/myconf/my.cnf`: mysqlの設定ファイルの置き場所です。
- environment
  - `MYSQL_USER`: 作成するユーザ名を設定します
  - `MYSQL_PASSWORD`: 作成するユーザのパスワードを設定します
  - `MYSQL_ROOT_PASSWORD`: ルートユーザのパスワードを設定します



### ② my.cnfを用意
 myconfにmy.cnfを入れて以下をコピペします。

```:myconf/my.cnf
[mysqld]
default-time-zone='+9:00'
character-set-server=utf8mb4

[client]
default-character-set = utf8mb4
```
日本時間のタイムゾーンと、日本語を表示するための文字コードを設定しています。


### ③ Dockerコンテナ起動
```
docker compose up -d
```
少し待って、
`Creating my-mysql ... done`
と表示されたらOKです。

docker psで確認してみます。
```
docker ps

CONTAINER ID   IMAGE       COMMAND                  CREATED          STATUS          PORTS                                                  NAMES
x0x00x0000x0   mysql:8.0   "docker-entrypoint.s…"   29 minutes ago   Up 29 minutes   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   my-mysql
```

コンテナ内に入ってみます。
```
docker exec -it my-mysql bash

root@x0x00x0000x0:/#
```
入れていそうです。
`ls`してみます。
```
bin   docker-entrypoint-initdb.d  home	 media	proc  sbin  tmp
boot  entrypoint.sh		  lib	 mnt	root  srv   usr
dev   etc			  lib64  opt	run   sys   var
```
問題なさそうです。 
抜ける時は`exit`を叩けばOKです。


### ④ データベースの作成
データベースを作ります。
Dockerコンテナ内のMySQLに入ります。
```
docker exec -it my-mysql mysql -uroot -ppass
```

create databaseをします。
```
create database mydb
```

showで確認してみます。
```
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mydb               | <- ある
| mysql              |
| performance_schema |
| sys                |
+--------------------+
```

できてますね。

ついでにdocker-compose.ymlで設定したユーザも確認してみます。

```
mysql> select user,host from mysql.user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| root             | %         |
| user             | %         | <- いる
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+
6 rows in set (0.00 sec)
```
ちゃんといますのでOKです。

### ⑤ SQL ファイルの取り込み

tmp配下に以下のファイルを作成します。
```sql:sample.sql
CREATE TABLE mydb.users (
  id int,
  name varchar(10)
);
```

SQL ファイルをコンテナにコピーし、

```
docker cp sql/tmp/sample.sql <CONTAINER ID(docker psで確認可能)>:/usr/local/etc
```

docker コンテナに入り、

```
docker exec -it <CONTAINER ID> bash
```

SQL を取り込みます。

```
mysql -uroot -ppass mydb < /usr/local/etc/sample.sql
```

確認するとテーブルが作成されているのがわかります。

```
mysql -uroot -ppass mydb

mysql> show tables;
+----------------+
| Tables_in_mydb |
+----------------+
| users          |
+----------------+
1 row in set (0.00 sec)
```

以上

## 📔 参考
参考にさせていただきました
- [Dockerでデータを永続化しつつMySQLの環境を構築する方法を解説](https://mo-gu-mo-gu.com/mysql-env-with-docker/)