Dockerfileとは
Dockerfileはイメージにレイヤを追加する設定ファイルです。コンテナはレイヤで構成されています。Dockerfile内の特定のコマンド(FROM
、ADD
、COPY
など)を実行するたびに新しいレイヤが生成されます。
なぜDockerfileが必要なのか
Docker Hubなどの一般に公開されているDockerイメージは汎用的に作られています。そのため、手元で使う際には追加で何かしらのモジュールのインストールや設定ファイルなどが必要になることもあると思います。Dockerfileを使えば、そのようなDockerイメージの拡張を行うことができます。
Dockerfileで利用できる命令の一部
命令 | 説明 |
---|---|
FROM | ベースイメージを追加する |
RUN | コマンドを実行してレイヤを確定する |
ENV | イメージの環境変数を指定する |
ARG | イメージビルド時の変数を定義する |
COPY | ホストマシンのファイルをイメージにコピーする |
ADD | ホストマシンやインターネットのファイルをイメージに追加する |
ENTRYPOINT | コンテナ起動時に実行するコマンドを指定する |
CMD | コンテナ起動時に実行するコマンドのデフォルト部を指定する |
Dockerfileを作ってみる
環境変数の設定
MySQLイメージからコンテナを起動し、現在時刻がどうなっているか確認してみます。
デフォルトではタイムゾーンはUTCなので、これを日本時間に直してあげます
Dockerfile
FROM mysql:8.4.3
ENV TZ=Asia/Tokyo
ビルドしてからコンテナを起動して現在時刻を確認してみます。
ビルド
% docker image build -t my-mysql:time .
コンテナの起動
% docker container run --name db --rm --detach --env MYSQL_ROOT_PASSWORD=secret --publish 3306:3306 my-mysql:tokyo
% mysql --host=127.0.0.1 --port=3306 --user=root --password=secret
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2024-10-26 16:10:41 |
+---------------------+
1 row in set (0.00 sec)
select now();で現在時刻を確認してみると、日本時間になっていることが確認できます。docker container stop db
でコンテナは停止できます。
このようにしてENVを使えば環境変数を変更することができます。
ホストマシンのファイルをイメージにコピー
先ほど起動したMySQLコンテナは、クエリを実行しても一般クエリログが出ません。ログを有効し化して出力先を設定するためには設定ファイル(/etc/my.cnf)を作成する必要があります。
自分のPC内で設定ファイルを作成します。
my.cnf
[mysqld]
general_log = 1
general_log_file = /var/log/query.log
続いて、my.cnfファイルと同じディレクトリにDockerfileを作成します。COPYを使ってホストマシンのコピー元ファイルをイメージ内にコピーします。
Dockerfile
FROM mysql:8.2.0
ENV TZ=Asia/Tokyo
COPY ./my.cnf /etc/my.cnf
先ほどと区別するために異なるタグでビルドしてイメージを作成します。
ビルド
% docker image build -t my-mysql:time .
ログを確認するために、コンテナを起動してクエリを発行します。
コンテナの起動
% docker container run --name db --rm --detach --env MYSQL_ROOT_PASSWORD=secret --publish 3306:3306 my-mysql:log
% mysql --host=127.0.0.1 --port=3306 --user=root --password=secret
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2024-10-26 16:10:41 |
+---------------------+
1 row in set (0.00 sec)
mysql> exit
クエリを実行したので、次は一般クエリログを確認します。my.cnfで出力先として設定した/var/log/query.logを確認してみます。
% docker container exec db ls /var/log
mysqld.log
query.log
% docker container exec db tail -n 5 /var/log/query.log
)engine = 'performance_schema'
2024-10-27T10:33:59.890286Z 8 Connect root@_gateway on using SSL/TLS
2024-10-27T10:33:59.891387Z 8 Query select @@version_comment limit 1
2024-10-27T10:34:14.661208Z 8 Query select now()
2024-10-27T10:34:16.362365Z 8 Quit
my.cnfによる設定が反映されていることが確認できました。