DockerでMySQL環境を0 -> 1で作る

# 本記事でやること
DockerでMySQL環境を作る
Databaseを作る
テーブルを作る
データをいれる

# 環境
Docker
mysql 5.7

# DockerでMySQL環境を作る
本記事で使う親フォルダを作る

```
$ mkdir mysql-sample
```

そして、 docker-compose.yml を作る

```docker-compose.yml
version: "3"
services:
  mysql:
    image: mysql:5.7
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: mysql
    volumes:
      - "./mysql/db-data/:/var/lib/mysql" # データ永続化
      - "./mysql/my.cnf:/etc/mysql/conf.d/my.cnf" # 日本語をデータとして使うために必要
```

MySQL関連のデータをおく場所として mysql フォルダを作る.

そして、MySQLの設定ファイルはmy.cnfに書く。

```msql/my.cnf
[mysqld]
character-set-server=utf8
```

これによりmysqlのデータとして日本語を入力することができる

```
mysql-sample
├── docker-compose.yml
└── mysql
    └── my.cnf
```

mysql clientはmysqlのイメージに含まれている。
本記事ではそれを使う。

```
docker-compose up -d
```
でコンテナを立ち上げる。
すると、mysqlが初期化され、
プロジェクトのmysqlフォルダ以下に db-data というフォルダができる


![スクリーンショット 2021-01-10 22.08.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/18e7db08-e1b1-5f94-0e66-fd1afb515b9f.png)

Attach Shellでコンテナに入る

mysql clientを以下で起動

```
$ mysql -u root -p
```

パスワードは docker-compose.yml で設定した `mysql`

```.sql
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

...

mysql> 
```

これでmysqlを起動するまで完了

# databaseを作る

dbを全て表示

```.sql
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.04 sec)

mysql> 
```

ここに新しく sample というdbを追加する

```.sql
mysql> create database sample;
Query OK, 1 row affected (0.02 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sample             |
| sys                |
+--------------------+
5 rows in set (0.02 sec)

mysql> 
```

このdbを操作するために以下のコマンドを打つ

```
mysql> use sample;
Database changed
```

これでdb作成まで完了


# テーブル作成

最初はテーブルはない。

```
mysql> show tables;
Empty set (0.01 sec)

mysql> 
```

そこで、テーブルを作るコマンドを打つが、テーブルを打つコマンドは長いので先にテキストエディタ等で書いておく

```.sql
CREATE TABLE users (
id int PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL UNIQUE,
password CHAR(36) NOT NULL
);
```

usersというテーブルを作成する。

このクエリについての解説はざっくり以下

|カラム|型|説明|
|:--:|:--|:--|
|id| int(数値) | userを特定するための数字。主キー。自動連番 |
|username| varchar(255) (文字列) | ユーザー名 |
|email| varchar(255) | メールアドレス、重複させないためにUNIQUE |
|password| CHAR(36) <br>(36字以内の英文字) | パスワード。UUIDの文字列にあわせて36 |


上記のクエリをそのままはりつけて実行

```.sql
mysql> CREATE TABLE users (
    -> id int PRIMARY KEY AUTO_INCREMENT,
    -> username VARCHAR(255) NOT NULL,
    -> email VARCHAR(255) NOT NULL UNIQUE,
    -> password CHAR(36) NOT NULL
    -> );
Query OK, 0 rows affected (0.07 sec)

mysql> show tables;
+------------------+
| Tables_in_sample |
+------------------+
| users            |
+------------------+
1 row in set (0.01 sec)

mysql> show columns from users;
+----------+--------------+------+-----+---------+----------------+
| Field    | Type         | Null | Key | Default | Extra          |
+----------+--------------+------+-----+---------+----------------+
| id       | int(11)      | NO   | PRI | NULL    | auto_increment |
| username | varchar(255) | NO   |     | NULL    |                |
| email    | varchar(255) | NO   | UNI | NULL    |                |
| password | char(36)     | NO   |     | NULL    |                |
+----------+--------------+------+-----+---------+----------------+
4 rows in set (0.02 sec)

mysql> 
```

これでテーブル作成完了


# データを追加

UUIDの作成。

macならuuidgenでさくっと作れる。
powershellなら[Guid]::NewGuid()
=> 224A68FF-FB77-4F97-94CF-8B7AD846DE05

```.sql
insert into users (username, email, password) values ("Teach", "teach@example.com", "uooooo");
```


```.sql
mysql> insert into users (username, email, password) values ("Teach", "teach@example.com", "uooooo");
Query OK, 1 row affected (0.01 sec)

mysql> 
```

# データの取得

```.sql
mysql> select * from users;
+----+----------+-------------------+----------+
| id | username | email             | password |
+----+----------+-------------------+----------+
|  1 | Teach    | teach@example.com | uooooo   |
+----+----------+-------------------+----------+
1 row in set (0.00 sec)

mysql> 
```

# 補足

Dockerの他のコンテナからdbをみるときのhostは docker-compose.yml のservice名になる。
したがって以下のように接続する

```
mysql -u root -h mysql -p
```