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.sql、02_create_data.sqlファイルをコンテナ側の指定のディレクトリにコピーしています。
コピー先に指定している「/docker-entrypoint-initdb.d/」ですが、コンテナ起動時にこのディレクトリに配置してあるSQLファイルを実行してくれます。
データベースに初期データを投入したい時に便利です。
次にDockerfile内でよく使われる命令を紹介します。
コマンド | 説明 |
---|---|
FROM | ビルドするイメージのベースイメージ |
RUN | イメージビルド時に、コンテナで実行するコマンドを定義 |
COPY | ホスト側からコンテナ側にファイルやディレクトリをコピー |
ADD | COPYコマンド+αの機能を提供。URLからダウンロードしてコピー先に転送などができる |
CMD | docker run 時に実行されるコマンド |
ENTRYPOINT | コンテナを実行可能ファイルとして使用する際に定義するコマンド |
ARG | docker 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コマンドで確認して、コンテナが表示されていなことを確認します。
まとめ
以上、DockerfileからMySQLのDockerイメージを作成して、コンテナの起動まで行う手順をご紹介しました。
最後まで読んでいただき、ありがとうございました。
この記事が少しでもみなさまのお役に立てれば嬉しいです。