【Docker入門】DockerfileからMySQLのDockerイメージを作成する

DockerfileからMySQLイメージを作成して
起動する手順を紹介します!

目次

Dockerイメージ作成準備

作成するファイルの構成

このようなディレクトリ構成で「Dockerfile」、「01_create_db.sql」、「02_create_data.sql」の3ファイルと「db_data」ディレクトリを作成します。

$ tree mysql8
mysql8
├── 01_create_db.sql
├── 02_create_data.sql
├── Dockerfile
└── db_data

Dockerfileを作成する

FROM mysql:8.0

COPY 01_create_db.sql /docker-entrypoint-initdb.d/01_create_db.sql
COPY 02_create_data.sql /docker-entrypoint-initdb.d/02_create_data.sql

ENV MYSQL_ROOT_PASSWORD=root

VOLUME ./db_data:/var/lib/mysql

FROM:ビルドするイメージのベースイメージを取得します。
COPY:ホスト側からコンテナ側にファイルやディレクトリをコピーします。
ENV:コンテナ内の環境変数を定義します。
VOLUME:db_dataディレクトリをコンテナ内の/var/lib/mysqlにマウントしています。

ここでは、mysql:8.0のベースイメージを使用して、ローカルPCにある 01_create_db.sql02_create_data.sqlファイルをコンテナ側の指定のディレクトリにコピーしています。
コピー先に指定している「/docker-entrypoint-initdb.d/」ですが、コンテナ起動時にこのディレクトリに配置してあるSQLファイルを実行してくれます。
データベースに初期データを投入したい時に便利です。

次にDockerfile内でよく使われる命令を紹介します。

コマンド説明
FROMビルドするイメージのベースイメージ
RUNイメージビルド時に、コンテナで実行するコマンドを定義
COPYホスト側からコンテナ側にファイルやディレクトリをコピー
ADDCOPYコマンド+αの機能を提供。URLからダウンロードしてコピー先に転送などができる
CMDdocker run 時に実行されるコマンド
ENTRYPOINTコンテナを実行可能ファイルとして使用する際に定義するコマンド
ARGdocker image build時に利用する変数
ENVコンテナ内の環境変数を定義
EXPOSEコンテナが公開するポート
VOLUMEホストや他のコンテナからマウント可能なボリュームを指定する
LABELイメージに追加するメタデータ
STOPSIGNALコンテナに送られて終了するシステムコール信号を設定
HEALTHCHECKコンテナ内でコマンドを実行し、その結果をヘルスチェック(死活監視)として利用する
USERコンテナで使用されるユーザ名(UID)
WORKDIR作業ディレクトリを変更する
ONBUILDコンテナ内で実行するコマンドを定義するが、定義したイメージでは実行されない。
ONBUILDを定義したベースイメージを利用するイメージのビルド時に実行される。

参考

この書籍ではDocker・Docker Compose・Kubernetesについて実践的な内容が解説されています。
Docker関連技術を網羅的に学習できます。

01_create_db.sqlを作成する

CREATE DATABASE IF NOT EXISTS employees;
USE employees;

CREATE TABLE employees (
    emp_no      INT             NOT NULL,
    birth_date  DATE            NOT NULL,
    first_name  VARCHAR(14)     NOT NULL,
    last_name   VARCHAR(16)     NOT NULL,
    gender      ENUM ('M','F')  NOT NULL,    
    hire_date   DATE            NOT NULL,
    PRIMARY KEY (emp_no)
);

index.htmlを作成する

USE employees;

INSERT INTO `employees` VALUES (10001,'1953-09-02','Georgi','Facello','M','1986-06-26'),
(10002,'1964-06-02','Bezalel','Simmel','F','1985-11-21'),
(10003,'1959-12-03','Parto','Bamford','M','1986-08-28'),
(10004,'1954-05-01','Chirstian','Koblick','M','1986-12-01'),
(10005,'1955-01-21','Kyoichi','Maliniak','M','1989-09-12'),
(10006,'1953-04-20','Anneke','Preusig','F','1989-06-02'),
(10007,'1957-05-23','Tzvetan','Zielinski','F','1989-02-10'),
(10008,'1958-02-19','Saniya','Kalloufi','M','1994-09-15'),
(10009,'1952-04-19','Sumant','Peac','F','1985-02-18'),
(10010,'1963-06-01','Duangkaew','Piveteau','F','1989-08-24');

Dockerイメージを作成する

必要なファイルの準備ができたので、いよいよDockerイメージを作成します。

Dockerイメージを作成するには docker build コマンドを使用します。

$ docker build -t mysql8 .
Sending build context to Docker daemon   5.12kB
Step 1/5 : FROM mysql:8.0
 ---> 3218b38490ce
Step 2/5 : COPY 01_create_db.sql /docker-entrypoint-initdb.d/01_create_db.sql
 ---> 6377a36eb74c
Step 3/5 : COPY 02_create_data.sql /docker-entrypoint-initdb.d/02_create_data.sql
 ---> ac28e922e1ef
Step 4/5 : ENV MYSQL_ROOT_PASSWORD=root
 ---> Running in 8c601f527d83
Removing intermediate container 8c601f527d83
 ---> cd8e639644c2
Step 5/5 : VOLUME ./db_data:/var/lib/mysql
 ---> Running in 36e0efc20cfc
Removing intermediate container 36e0efc20cfc
 ---> ce1ca4e0e17f
Successfully built ce1ca4e0e17f
Successfully tagged mysql8:latest

作成されたDockerイメージを確認します。

$ docker images

REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
mysql8                              latest              ce1ca4e0e17f     14 minutes ago   516MB

先ほど作成したDockerfileからイメージが作成されました!

作成したイメージを使ってDockerコンテナを起動する

コンテナを起動するには以下のようにコマンドを実行します。

$ docker run --name <コンテナ名> --rm -d -p <ホスト側ポート>:<コンテナ側ポート> <イメージ名>

「docker run」:コンテナを起動するコマンドです。

「–name <コンテナ名>」:コンテナ名には任意の名前を指定します。コンテナの識別や操作にこの名前を使うことができるので指定しておくことをおすすめします。

「–rm」:このオプションをつけると docker stop でコンテナを停止した際、コンテナの削除も行いますので、指定しておくことをおすすめします。

「-d」: デタッチモードで起動します。この指定でコンテナがバックグラウンドで実行します。

「-p」:ホスト側ポートはパソコン側のポートで、コンテナ側ポートは起動したDockerコンテナのポートになります。

「イメージ名」:先ほどdocker buildの時に指定したイメージ名を指定します。

それでは実際にコンテナを起動してみましょう。

$ docker run --name docker-mysql8 --rm -d -p 13306:3306 mysql8

コンテナが起動しているか確認します。

起動しているコンテナを確認するには docker ps コマンドを使用します。

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                NAMES
e6378462a05b        mysql8              "docker-entrypoint.s…"   16 minutes ago      Up 16 minutes       33060/tcp, 0.0.0.0:13306->3306/tcp   docker-mysql8

STATUSがUPになっているので起動しているようです。

ではMySQLサーバーにアクセスしてみましょう。

$ mysql -uroot -proot -h127.0.0.1 -P13306

mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10
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> 

MySQLサーバーに接続できました!

続いて、コンテナ起動時に作成したデータベースとテーブルを確認してみましょう。

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| employees          |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.01 sec)

mysql> use employees
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_employees |
+---------------------+
| employees           |
+---------------------+
1 row in set (0.00 sec)

データベースもテーブルもちゃんと作成されていますね!

続いて、テーブルの中身を覗いてみましょう。

mysql> select * from employees;
+--------+------------+------------+-----------+--------+------------+
| emp_no | birth_date | first_name | last_name | gender | hire_date  |
+--------+------------+------------+-----------+--------+------------+
|  10001 | 1953-09-02 | Georgi     | Facello   | M      | 1986-06-26 |
|  10002 | 1964-06-02 | Bezalel    | Simmel    | F      | 1985-11-21 |
|  10003 | 1959-12-03 | Parto      | Bamford   | M      | 1986-08-28 |
|  10004 | 1954-05-01 | Chirstian  | Koblick   | M      | 1986-12-01 |
|  10005 | 1955-01-21 | Kyoichi    | Maliniak  | M      | 1989-09-12 |
|  10006 | 1953-04-20 | Anneke     | Preusig   | F      | 1989-06-02 |
|  10007 | 1957-05-23 | Tzvetan    | Zielinski | F      | 1989-02-10 |
|  10008 | 1958-02-19 | Saniya     | Kalloufi  | M      | 1994-09-15 |
|  10009 | 1952-04-19 | Sumant     | Peac      | F      | 1985-02-18 |
|  10010 | 1963-06-01 | Duangkaew  | Piveteau  | F      | 1989-08-24 |
+--------+------------+------------+-----------+--------+------------+
10 rows in set (0.00 sec)

テーブルのデータもしっかり登録されていることが確認できました!

コンテナの停止

コンテナを停止するには以下のコマンドを実行します。

$ docker stop <コンテナID or コンテナ名>

$ docker stop docker-mysql8

docker psコマンドで確認して、コンテナが表示されていなことを確認します。

あわせて読みたい
【HTML・プログラミング独学】初心者でも独学したい!プログラミングが身につく厳選おすすめサイト プログラミングは初心者だけど、独学で勉強してみたい! プログラミングを全くしたことがない初心者でも独学で勉強できるおすすめサイトを厳選して紹介します! 初心者...

まとめ

以上、DockerfileからMySQLのDockerイメージを作成して、コンテナの起動まで行う手順をご紹介しました。

最後まで読んでいただき、ありがとうございました。
この記事が少しでもみなさまのお役に立てれば嬉しいです。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次