どうも、nippa です。
前回の内容:
Docker MySQL を docker-compose 化を行います。
ツール化して持っておけば、今後簡単に開発環境ごとにデータベースを用意することがで きるようになります。
環境
ディレクトリ構造
今回は以下のようなディレクトリ構造です。
. ├── docker-compose.yaml └── mysql/ ├── data/ ├── dockerfile └── init/ └── init.sql
data
は postgresql のデータが保存されるディレクトリ、init
はコンテナの初回起動
時に実行されるスクリプトを格納するディレクトリになります。
dockerfile の作成
dockerfile の内容は前回同様です。
FROM mysql:latest # Time Zone 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 **/ 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 化を行いました。
開発の環境構築が捗ること間違いないですね。
是非、試してみてください。
ではでは、また次回。