IT技術で仕事を減らしたい!

素人ITエンジニアのメモ+α

Docker MySQLの環境構築(その2)

どうも、nippa です。

前回の内容:

timesaving.hatenablog.com

Docker MySQL を docker-compose 化を行います。

ツール化して持っておけば、今後簡単に開発環境ごとにデータベースを用意することがで きるようになります。

環境

ディレクトリ構造

今回は以下のようなディレクトリ構造です。

.
├── docker-compose.yaml
└── mysql/
    ├── data/
    ├── dockerfile
    └── init/
        └── init.sql

datapostgresql のデータが保存されるディレクトリ、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 化を行いました。

開発の環境構築が捗ること間違いないですね。

是非、試してみてください。

ではでは、また次回。