今回は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では作成しません。
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です。他にもTablePlusやsequel proMySQL Workbenchなど色々なツールがありますのでお好きなものを使用してください。
以下のように情報を入力します。基本的にdocker-compose.ymlの内容を参考に。入力後テスト接続を押下し、
##公式のサンプルデータを流し込む
MySQLには公式でサンプルデータを用意してくれています。それを流し込んで勉強用として使いたいと思います。
MySQLのちゃんとしたサンプルデータ
今回は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が追加されていることを確認します。
このようにデータが入っていれば完了です。
##SQL実行
最後に簡単なSELECT文だけ実行して終了にしたいと思います。
DBeaverのSQLエディタから
SELECT
*
FROM
world.city
;
内容が表示されれば問題なしです。
##最後に
最後まで読んでいただいてありがとうございました。これでSQL文を実行する環境は整ったのであとはガシガシ学習していければと思います。ありがとうございました。