どうも、nippa です。
前回の内容:
timesaving.hatenablog.com
Docker MySQL を docker-compose 化を行います。
ツール化して持っておけば、今後簡単に開発環境ごとにデータベースを用意することがで
きるようになります。
環境
今回は以下のようなディレクトリ構造です。
.
├── docker-compose.yaml
└── mysql/
├── data/
├── dockerfile
└── init/
└── init.sql
data
は postgresql のデータが保存されるディレクトリ、init
はコンテナの初回起動
時に実行されるスクリプトを格納するディレクトリになります。
dockerfile の作成
dockerfile の内容は前回同様です。
FROM mysql:latest
ENV TZ Asia/Tokyo
RUN apt update
docker コマンドでビルドする場合は、以下のコマンドで行います。
docker build -t mysql ./mysql
init.sql の作成
初回起動時に実行される SQL スクリプトです。内容は以下の通りです。
users テーブルを作成しています。スキーマの作成は docker-compose の環境変数で行い
ます。
SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME='test';
USE test;
CREATE TABLE IF NOT EXISTS users (
id int AUTO_INCREMENT PRIMARY KEY,
username VARCHAR ( 50 ) UNIQUE NOT NULL,
password VARCHAR ( 50 ) NOT NULL,
email VARCHAR ( 255 ) UNIQUE NOT NULL,
created_on TIMESTAMP NOT NULL
);
docker-compose.yaml の作成
docker-compose.yaml にコンテナの起動情報を記載します。
version: "3"
services:
db:
build: ./mysql
container_name: mysql
hostname: mysql
ports:
- 3306:3306
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=test
- MYSQL_USER=test
- MYSQL_PASSWORD=test
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/init:/docker-entrypoint-initdb.d
上の docker-compose.yaml を docker コマンドで実行する場合は、以下のような形にな
ります。
docker run --name db -it -p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=root \
-e MYSQL_DATABASE=test \
-e MYSQL_USER=test \
-e MYSQL_PASSWORD=test \
-v ./mysql/data:/var/lib/mysql \
-v ./mysql/init:/docker-entrypoint-initdb.d
-d mysql
docker-compose の起動と終了
docker-compose の起動コマンドは以下の通りです。
docker-comppose up -d
docker-compose の終了コマンドは以下の通りです。
docker-comppose down
データベースの確認
以下のコマンドでコンテナの MySQL にログインします
mysql -u test -h 127.0.0.1 -p -D test
Enter password: [パスワードの入力]
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.27 MySQL Community Server - GPL
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
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 tables;
# 出力
+
| Tables_in_test |
+
| users |
+
1 row in set (0.00 sec)
mysql> select * from users;
Empty set (0.00 sec)
データの挿入をしてみます。
INSERT INTO users (username, password, email, created_on) VALUES ('Yamada Taro', 'yamadatraro', 'yamada-taro@example.com', now());
データの確認を行います。
mysql> select * from users;
+
| id | username | password | email | created_on |
+
| 1 | Yamada Taro | yamadatraro | yamada-taro@example.com | 2021-11-21 21:24:20 |
+
1 row in set (0.00 sec)
docker-compose の終了し、再度起動して、データが読み込まれているかを確認します。
docker-compose down
docker-compose ps
NAME COMMAND SERVICE STATUS PORTS
docker-compose up -d
docker-compose ps
NAME COMMAND SERVICE STATUS PORTS
mysql "docker-entrypoint.s…" db running 0.0.0.0:3306->3306/tcp
データベースへアクセスします。
mysql -u test -h 127.0.0.1 -p -D test
mysql> select * from users;
+
| id | username | password | email | created_on |
+
| 1 | Yamada Taro | yamadatraro | yamada-taro@example.com | 2021-11-21 21:24:20 |
+
1 row in set (0.00 sec)
データが保存されていることが確認できました。
感想
PostgreSQL に続き、MySQL での docker-compose 化を行いました。
開発の環境構築が捗ること間違いないですね。
是非、試してみてください。
ではでは、また次回。