7
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-11-07

今回は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)よく使うオプションも紹介

##docker-compose.yml

以下の内容をコピペしてください。
(内容の説明については下記の参考記事のdocker-compose.ymlの箇所をご覧ください。)
DockerでLaravel+MySQL+phpMyadminの環境構築

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

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です。他にもTablePlussequel proMySQL Workbenchなど色々なツールがありますのでお好きなものを使用してください。

作業ディレクトリを作成し、接続ボタンを押下します。
スクリーンショット 2020-11-07 17.08.03.png

今回はMySQLを使用するのでMySQLを選択します。
スクリーンショット 2020-11-07 17.08.23.png

以下のように情報を入力します。基本的にdocker-compose.ymlの内容を参考に。入力後テスト接続を押下し、
スクリーンショット 2020-11-07 17.54.49.png

以下のように接続できます。
スクリーンショット 2020-11-07 17.56.59.png

終了ボタンを押下して完了です。
スクリーンショット 2020-11-07 17.57.23.png

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

MySQLには公式でサンプルデータを用意してくれています。それを流し込んで勉強用として使いたいと思います。
MySQLのちゃんとしたサンプルデータ

スクリーンショット 2020-11-07 17.19.33.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

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

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

DBeaverのSQLエディタから

SELECT 
*
FROM 
world.city
;

と実行して、
スクリーンショット 2020-11-07 18.16.25.png

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

##最後に

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

7
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?