2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Dockerfileって何?

Last updated at Posted at 2024-10-27

Dockerfileとは

Dockerfileはイメージにレイヤを追加する設定ファイルです。コンテナはレイヤで構成されています。Dockerfile内の特定のコマンド(FROMADDCOPYなど)を実行するたびに新しいレイヤが生成されます。

なぜ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による設定が反映されていることが確認できました。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?