Dockerfileとは

Dockerfileは、Dockerイメージを作成するための設計図です。
テキスト形式のファイルとして、イメージ作成時に必要なコマンドや設定を順序立てて記述することで、誰でも再現性のあるイメージをビルドできるようになります。

Dockerイメージには、OSやライブラリ、アプリケーションなど、実行に必要な環境が含まれています。Dockerfileを使えば、これらの構成を明示的に管理できるため、バージョン管理やチーム開発にも適しています。

たとえば以下のような内容をDockerfileに記述できます:

  • ベースとするOSの指定(例:Ubuntu)
  • ソフトウェアのインストール手順
  • 必要なファイルの配置
  • 環境変数の設定
  • コンテナ起動時に実行するコマンドの指定

イメージの取得と作成の違い

Dockerでは、あらかじめ用意されたイメージをDocker Hubなどのレジストリから取得(pull)することが可能です。

1
$ docker image pull ubuntu:20.04

このように取得する方法は簡便ですが、プロジェクトに応じたカスタマイズや依存関係の管理が難しくなります。

一方で、Dockerfileを利用すれば、必要な依存パッケージのインストールや特定の構成でのアプリケーションの組み込みなどを自動化できます。
そのため、実際の開発や本番環境では、Dockerfileをベースにした独自イメージのビルドが一般的です。

Dockerfileでイメージをビルドする

Dockerfileに記述された内容をもとにDockerイメージを作成するには、docker image buildコマンドを使用します。

docker image buildコマンドの基本

以下は、カレントディレクトリにあるDockerfileを用いてイメージをビルドする基本的なコマンドです。

1
$ docker image build -t myimage:1.0 .

このコマンドの各要素の意味は以下の通りです:

  • build:Dockerイメージのビルドを実行するサブコマンド
  • -t:ビルド後のイメージに付けるタグ(任意名とバージョン)
  • .:ビルドコンテキストのパス(後述)

タグを省略した場合、イメージには<none>という名前が付けられ、後から識別するのが困難になります。開発時には明示的にタグを付けることを推奨します。

1
2
3
$ docker image ls
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
myimage      1.0       a1b2c3d4e5f6    10 seconds ago  100MB

ビルドが成功すると、指定した名前とタグの付いたイメージがローカルに保存されます。

ビルド時に重要な概念

Dockerfileからのイメージビルドでは、以下の3つの概念が特に重要です:

  • ビルドコンテキスト
  • Dockerfileの配置と指定
  • .dockerignoreの活用

ビルドコンテキストとは

docker image buildコマンドで指定するパス(例:.)は、Dockerfileの場所ではなく「ビルドコンテキスト」と呼ばれるディレクトリを指します。

ビルドコンテキストは、イメージのビルド時にDockerが必要とするファイル群のルートディレクトリです。
このコンテキストに含まれるファイルがDockerデーモンに送られ、イメージの構築に使用されます。

1
$ docker image build -t myimage:1.0 .

この例では、カレントディレクトリ(.)がビルドコンテキストです。Dockerfileだけでなく、ビルドに使用するファイル(COPY対象など)もこのディレクトリに含まれている必要があります。

DockerデーモンとCLIの関係

CLIでのビルド命令は内部的にはREST API経由でDockerデーモンに送信されます。
そのため、Dockerデーモンが別マシンにある場合でも、ローカルのCLIからリモートでビルドを実行できます。

この構造上、ビルド時にはコンテキスト全体がデーモンに転送されるため、不要なファイルを含めない設計が重要です。

Dockerfileの配置と指定

Dockerfileは通常、ビルドコンテキストのルートディレクトリに配置します。
この場合、docker image buildは自動的にDockerfileを読み取ります。

別の場所にある場合は、-fオプションでパスを指定します。

1
$ docker image build -f ./Dockerfile ./app

この例では、Dockerfileが./Dockerfile、ビルドコンテキストが./appです。
両者は同じディレクトリにある必要はありません。

.dockerignoreの活用

ビルドに不要なファイルを除外するには、.dockerignoreファイルを使用します。

*.log
node_modules/
secret.env

.dockerignoreはビルドコンテキストのルートに配置し、不要なファイルを除外してビルド効率を高めます。
記述方法は.gitignoreと似ていますが、対象はDockerデーモンへの転送内容です。

Dockerfileの基本命令

Dockerfileでは、以下のような命令を用いてイメージ構築の手順を定義します。

FROM:ベースイメージの指定

1
FROM ubuntu:20.04

イメージの土台となるベースイメージを指定します。Dockerfileは原則としてこの命令から始まります。

RUN:ビルド時のコマンド実行

1
RUN apt update && apt install -y nodejs

ビルド中に必要なコマンドを実行します。-yオプションを付けて非対話的にすることが重要です。

COPYとADD:ファイルコピー

1
COPY ./hello.js /app/

COPYは単純なコピーに使います。ADDはURLからの取得やアーカイブ展開など追加機能がありますが、用途が限定されます。

CMDとENTRYPOINT:起動時のコマンド指定

1
2
CMD ["node", "app.js"]
ENTRYPOINT ["node"]

CMDは上書き可能、ENTRYPOINTは常に実行され、CMDはその引数になります。

WORKDIR:作業ディレクトリの指定

1
WORKDIR /app

以降の命令の作業ディレクトリを指定します。存在しない場合は自動作成されます。

ENVとARG:変数の利用

1
2
ENV GREETING="Hello"
ARG GREETING="Hello"

ENVはビルド時と実行時両方で有効、ARGはビルド時のみ有効です。

LABEL:メタ情報の追加

1
LABEL maintainer="example@example.com"

イメージに付加情報を設定できます。docker image inspectで確認可能です。

EXPOSE:公開ポートの指定

1
EXPOSE 80

コンテナ実行時のポート公開を示唆しますが、実際には-pオプションが必要です。

応用:マルチステージビルド

マルチステージビルドでは、1つのDockerfile内に複数のステージを定義し、ビルド用と実行用の環境を分離できます。

1
2
3
4
5
FROM build-image AS builder
# ビルド処理

FROM runtime-image
COPY --from=builder /app/bin /app/

これにより、不要なツールや一時ファイルを本番イメージに含めず、サイズやセキュリティを最適化できます。

環境切り替えの例

1
2
3
4
5
6
7
8
FROM ubuntu:20.04 AS base
CMD ["sh", "-c", "echo $env_value"]

FROM base AS dev
ENV env_value=DEV

FROM base AS prod
ENV env_value=PROD
1
2
$ docker image build --target dev -t myapp-dev .
$ docker image build --target prod -t myapp-prod .

1つのDockerfileで開発環境と本番環境を切り替えて管理できます。

まとめと活用のポイント

  • DockerfileはDockerイメージの設計図
  • docker image buildコマンドで再現性のあるイメージを作成
  • ビルドコンテキストや.dockerignoreを適切に設計して効率化
  • 命令(FROM, RUN, COPY, CMDなど)の意味を理解し使い分ける
  • マルチステージビルドにより、軽量・安全なイメージを構築可能

Dockerfileの理解と活用は、開発・運用の品質向上に直結します。基本を押さえたうえで、実践を通じて自分に合った最適な構築手法を見つけていきましょう。