SQL文学習~環境構築編~ Docker+MySQL

今回はMySQLを使って基本的なSQLを学習する環境をdockerを使って整えたので、共有したいと思います。普段業務で使うDBや学習用のDBとは環境を分けたい方にはお勧めです。

動作環境
Mac（Catallina 10.15.7）
Docker 19.03.13
docker-compose 1.27.4

docker、docker-composeは事前にインストールをしておいてください。

##ディレクトリ構成

```
.
├── docker-compose.yml  #docker-composeの設定ファイル
└── mysql
    ├── my.cnf #mysqlの設定ファイル
    └── volume/　#コンテナ内のデータを同期するために使います。（詳しくはdocker 永続化で検索）
```

このような表示の仕方を行うためのtreeコマンドについてこちらで記事にしています。
[ディレクトリ構成を簡単に表示！treeコマンド（Mac）よく使うオプションも紹介](https://qiita.com/tatema/items/8a1de3d3b87884cb0d21)

##docker-compose.yml

以下の内容をコピペしてください。
（内容の説明については下記の参考記事のdocker-compose.ymlの箇所をご覧ください。）
[DockerでLaravel+MySQL+phpMyadminの環境構築](https://qiita.com/tatema/items/9a541553058fdd7fd6a7)

また、今回はサンプルのDBをMySQLの公式から作成するのでdocker-compose.ymlでは作成しません。

```ruby:docker-compose.yml
version: '3'
services:
    mysql:
        image: mysql:5.7
        container_name: mysql_docker
        environment: 
            MYSQL_ROOT_PASSWORD: root
            MYSQL_USER: dbuser
            MYSQL_PASSWORD: dbpass
            TZ: 'Asia/Tokyo'
        command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
        volumes:
            - ./mysql/volume:/var/lib/mysql
            - ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf
        ports:
            - 13306:3306
```

上記をコピペできたら
docker-compose.ymlファイルがあるディレクトリで以下のコマンドを実行します。
最終的に下記のように表示されれば問題なしです。

```
[mac]$ docker-compose up -d
Creating network "dockermysql_default" with the default driver
Creating mysql_docker ... done
```

コンテナが立ち上がったことを確認してみます。

```
[Mac]$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                NAMES
aaeda519cf71        mysql:5.7           "docker-entrypoint.s…"   21 seconds ago      Up 5 seconds        33060/tcp, 0.0.0.0:13306->3306/tcp   mysql_docker
```

上記のように表示されれば問題なしです。

##クライアントツールで接続してみる。

クライアントツールで接続してみます。
今回使用するクライアントツールは[DBeaver](https://dbeaver.io/)です。他にも[TablePlus](https://tableplus.com/)や[sequel pro](https://www.sequelpro.com/)[MySQL Workbench](https://dev.mysql.com/downloads/workbench/)など色々なツールがありますのでお好きなものを使用してください。

作業ディレクトリを作成し、接続ボタンを押下します。
![スクリーンショット 2020-11-07 17.08.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663044/e6b95731-b8e9-f054-5f7a-a4197a27b786.png)

今回はMySQLを使用するのでMySQLを選択します。
![スクリーンショット 2020-11-07 17.08.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663044/1e4acd4b-81d5-7f1d-c697-5c14f340c35c.png)

以下のように情報を入力します。基本的にdocker-compose.ymlの内容を参考に。入力後テスト接続を押下し、
![スクリーンショット 2020-11-07 17.54.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663044/18c3f2d7-f088-63fe-f0ab-77cbbc47133f.png)



以下のように接続できます。
![スクリーンショット 2020-11-07 17.56.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663044/2d5cb166-e2c5-2c07-b141-86b090143b31.png)


終了ボタンを押下して完了です。
![スクリーンショット 2020-11-07 17.57.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663044/512945dc-6d57-735e-ceb3-0a22b4066ac9.png)




##公式のサンプルデータを流し込む

MySQLには公式でサンプルデータを用意してくれています。それを流し込んで勉強用として使いたいと思います。
[MySQLのちゃんとしたサンプルデータ](https://qiita.com/S-T/items/923cf689ee5f44525457)

![スクリーンショット 2020-11-07 17.19.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663044/3bfa6395-13e9-d2cf-443f-d8554803354d.png)

今回はgzip形式でダウンロードしたと思います。

ではダウンロードしたファイルを、今回のプロジェクトのルートディレクトリ（docker-compose.ymlがあるディレクトリ）に移動します。

```
.
├── docker-compose.yml
├── mysql
│   ├── my.cnf
│   └── volume / #ちなみにコンテナを立ち上げたのでこのディレクトリにはたくさんのフォルダが入っている。
└── world.sql.gz　←ここにいれる。
```

せっかくなのでdocker cpコマンドを使ってコンテナの中にフォルダを送ってみます。

```
[Mac]$ docker ps //これでコンテナの名前を確認します。
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                NAMES
aaeda519cf71        mysql:5.7           "docker-entrypoint.s…"   21 seconds ago      Up 5 seconds        33060/tcp, 0.0.0.0:13306->3306/tcp   mysql_docker
```

コンテナ名がmysql_dockerだとわかったのでコンテナに送ります。

```
[Mac]$ docker cp world.sql.gz mysql_docker:./
```
world.sql.gzをmysql_dockerのホームディレクトリにコピーするという意味です。

コピーできたら確認します。

```
[Mac]$ docker exec -it mysql_docker bash
[コンテナ]# ls | grep wold
world.sql.gz
```
上記のように出れば問題なしです。

では流し込んでいきます。

コンテナの中で、下記のコマンドを実行します。

```
[コンテナ]# zcat world.sql.gz | mysql -uroot -p //パスワードはdocker-compose.ymlで設定したrootユーザのパスワードです。
[コンテナ]#　//何も表示されなければ完了です。
[コンテナ]# mysql -uroot -p 
Enter password:
root@599851f8e10f:/# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.7.32 MySQL Community Server (GPL)

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

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

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

mysql> use world;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+-----------------+
| Tables_in_world |
+-----------------+
| city            |
| country         |
| countrylanguage |
+-----------------+
3 rows in set (0.00 sec)

mysql>

```

`zcat world.sql.gz | mysql -uroot -p `
zcat world.sql.gzで圧縮されたものの中身を出力し、それをmysqlサーバに流すというコマンドです。

`mysql -uroot -p`
-uでユーザを指定します。今回はrootユーザで入ります。
-pはパスワードを入力するというオプションです。

`show databases;`
全てのデータベースを出力します。これでworldというDBが入っていることを確認します。

`use world;`
laraveldbのデータベースを使うというコマンドです。

`show tables;`
使用中のデータベース（world）のテーブルを全て出力するというコマンドです。

##クライアントツールを使って詳細に確認します。

再びクライアントツールを開いて更新（F5）するとworldというDBが追加されていることを確認します。

![スクリーンショット 2020-11-07 18.06.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663044/1ce11245-8f2c-d472-2ea4-3d91c1620659.png)

このようにデータが入っていれば完了です。

##SQL実行
最後に簡単なSELECT文だけ実行して終了にしたいと思います。

DBeaverのSQLエディタから

```
SELECT 
*
FROM 
world.city
;
```
と実行して、
![スクリーンショット 2020-11-07 18.16.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663044/0a804eb5-7b96-fe4d-7333-4c4c6594bb94.png)

内容が表示されれば問題なしです。


##最後に

最後まで読んでいただいてありがとうございました。これでSQL文を実行する環境は整ったのであとはガシガシ学習していければと思います。ありがとうございました。