パンジェンシーの「汗だく開発日誌」

システム開発の備忘録です。

【Docker】MySQLのコンテナを作成する

パンジェン氏「東の森でシステムエンジニアをしております、パンジェンシーと申します。 最近ずっと家に籠もりっぱなしなので、お腹の脂肪が大変なことになっております。」

RDB環境を構築してみよう

f:id:x-fieldatts:20200731111130p:plain

学習用などに自由にイジれるデータベース環境が一つあると便利ですよね。Dockerを使えば、環境構築や廃棄が簡単にできそうなのでちょっと試してみました!

今回は、MySQLのコンテナを作成してみます。MySQL(まい・えすきゅーえる)は、オープンソースリレーショナルデータベース管理システムRDBMS)(Wikipediaより)の一つで、無料で使えて、世界中の多くのシステムで採用されているそうなので、これを使うことにします。

SQL(Structured Query Language)は、RDB(Relational Database)のデータを操作するための言語です。」

1. MySQLのコンテナを作成

Dockerを導入していない場合は、以下のエントリー⇩を参考に導入してみてください。

導入できたら、WSL2のターミナルに入りましょう。

今回は、Docker Composeというツールを使ってみましょう。このツールを使うと、イメージの作成方法やコンテナの設定などをファイルに残しておくことができます。今回はコンテナは1つですが、複数のコンテナを同時に管理する時にとても便利なのでぜひ使い方をマスターしておきましょう。

// 適当なディレクトリを作成
$ mkdir -p practice-mysql && cd practice-mysql

// 設定ファイルを作成
$ touch docker-compose.yml

mysqlというディレクトリにdocker-compose.ymlという設定ファイルを作成しました。今度は、エディターからこのファイルを開いて以下の内容を追加しましょう。

version: "3"
services:
  mysql: # サービス名
    image: mysql:latest # 基にするDockerイメージ
    container_name: db-mysql # 作成するDockerコンテナの名前
    volumes:
      - .:/home/pangency # 現在のパス'.'と、コンテナ内の'/home/pangency'をリンク
    environment:
      - MYSQL_ROOT_PASSWORD=root # rootパスワードを設定
// 上の設定は、下のコマンドとほぼ同様の意味になります。
$ docker run --name db-mysql \
    -e MYSQL_ROOT_PASSWORD=root \
    -v .:/home/pangency \
    -d mysql:latest

volumesというところに、.:/home/pangencyと記載していますが、これは、:の左側にホスト内のパス、右側にコンテナ内のパスを設定し、これらの場所をリンクする設定です。

今回の場合、.は現在のパスという意味なのでdocker-compose.ymlが置いてあるpractice-mysqlディレクトリ、右側がコンテナ内のパス/home/pangencyになり、これらをリンクするという設定になります。後で本当にリンクされているか確認してみましょう。

ファイルを保存したら、Dockerイメージを作成します。

// `docker-compose.yml`を保存したディレクトリで以下を実行します。
$ docker-compose build

// `skipping`などのメッセージが出た場合は、既に同じ内容のDockerイメージを持っているということなのでOKです。

イメージが作成できたか確認してみましょう。

// イメージの一覧を表示
$ docker-compose images
Container   Repository    Tag       Image Id       Size
---------------------------------------------------------
db-mysql    mysql        latest   6e447ce4863d   544.2 MB

// 上のような感じで作成できていればOKです!

次にコンテナを起動してみます。

// コンテナの起動
$ docker-compose up -d

// コンテナ一覧の表示
$ docker-compose ps
  Name               Command             State          Ports
--------------------------------------------------------------------
db-mysql   docker-entrypoint.sh mysqld   Up      3306/tcp, 33060/tcp

無事起動できました!

「Docker Composeで作成したコンテナを終了する場合は、docker-compose stop、コンテナを終了して削除する場合は、docker-compose downを実行しましょう。削除した場合は、データベースの内容も全て消えてしまうので注意してください!」

2. コンテナにログイン

コンテナにログインしてみましょう。

$ docker-compose exec mysql bash

コンテナ内でディレクトリを移動してみましょう。

# cd home/pangency
# ls

ここに、先程作成したdocker-compose.ymlがあるのではないかと思います。

volumes.:/home/pangencyと設定をしたことによって、ホスト側とコンテナ内のディレクトリをリンクできています。この機能を使えば、例えばホスト側で作成したsqlファイルを設置し、コンテナ内で実行することができます。

「コンテナ内からログアウトしてホストのターミナルに戻りたい場合は、exitコマンドを実行しましょう。」

3. データベースの作成

コンテナ内からデータベースを作成してみましょう。

コンテナ内でmysqlコマンドを実行してCUIツール「MySQLモニター」を起動します。

# mysql -u root -p
mysql>

以下のコマンドを売って、データベースpracticeを作成してみます。

mysql > create database practice;
mysql > show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| practice           |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

practiceという名前のデータベースが作成されました!

MySQLモニターを終了したい場合は、quitを実行しましょう。exitではないので注意です!」

4. テーブルの作成

無事、データベースが作成できたので、テーブルを作ってみましょう!ホスト側から以下のファイルを作成します。

// docker-compose.ymlのあるディレクトリにファイルを作成
$ touch create-table.sql

中身は何でもよいですが、今回は以下のような感じにします。エディターで編集しましょう。

-- テーブルが既にある場合は一旦削除
DROP TABLE IF EXISTS tasks;
-- テーブルの作成
CREATE TABLE tasks (
    id int primary key,
    title varchar(50),
    create_date datetime,
    create_person varchar(30)
);
-- データの挿入
INSERT INTO tasks (id, title, create_date, create_person) VALUES (1, 'read a book', sysdate(), 'pangency');
INSERT INTO tasks (id, title, create_date, create_person) VALUES (2, 'walk', sysdate(), 'pangency');
-- テーブルの表示
SELECT * FROM tasks;

コンテナにログインし、上記のsqlファイルを実行してみましょう。

// コンテナ内でディレクトリを移動
# cd home/pangency

// MySQLモニターの起動
# mysql -u root -p

// 使用するデータベースをpracticeに変更
mysql> use practice;

// sqlファイルの読み込み
mysql> source create-table.sql;
Query OK, 0 rows affected (0.05 sec)

Query OK, 0 rows affected (0.09 sec)

Query OK, 1 row affected (0.01 sec)

Query OK, 1 row affected (0.01 sec)

+----+-------------+---------------------+---------------+
| id | title       | create_date         | create_person |
+----+-------------+---------------------+---------------+
|  1 | read a book | 2020-07-20 04:44:34 | pangency      |
|  2 | walk        | 2020-07-20 04:44:34 | pangency      |
+----+-------------+---------------------+---------------+
2 rows in set (0.00 sec)

// テーブルの確認
mysql> show tables;
+--------------------+
| Tables_in_practice |
+--------------------+
| tasks              |
+--------------------+
1 row in set (0.00 sec)

無事、sqlファイルが読み込まれ、テーブルの作成とデータの挿入ができました!

「この環境なら、実行したいSQLファイルを作成してコマンドラインで即実行できるので色々試せますね!」

まとめ

今回は、Docker Composeを使って、MySQLのDockerコンテナの作成をしてみました。また、ホスト側とコンテナ内でのディレクトリのリンクも行ってみました。

Dockerがあれば、色々な環境を気軽に試せるのでとても便利ですね。

「今回の報告は以上です!ではまた!」