Dockerfileとは
Dockerfileは、Dockerイメージを作成するための設計図です。
テキスト形式のファイルとして、イメージ作成時に必要なコマンドや設定を順序立てて記述することで、誰でも再現性のあるイメージをビルドできるようになります。
Dockerイメージには、OSやライブラリ、アプリケーションなど、実行に必要な環境が含まれています。Dockerfileを使えば、これらの構成を明示的に管理できるため、バージョン管理やチーム開発にも適しています。
たとえば以下のような内容をDockerfileに記述できます:
- ベースとするOSの指定(例:Ubuntu)
- ソフトウェアのインストール手順
- 必要なファイルの配置
- 環境変数の設定
- コンテナ起動時に実行するコマンドの指定
イメージの取得と作成の違い
Dockerでは、あらかじめ用意されたイメージをDocker Hubなどのレジストリから取得(pull)することが可能です。
|
|
このように取得する方法は簡便ですが、プロジェクトに応じたカスタマイズや依存関係の管理が難しくなります。
一方で、Dockerfileを利用すれば、必要な依存パッケージのインストールや特定の構成でのアプリケーションの組み込みなどを自動化できます。
そのため、実際の開発や本番環境では、Dockerfileをベースにした独自イメージのビルドが一般的です。
Dockerfileでイメージをビルドする
Dockerfileに記述された内容をもとにDockerイメージを作成するには、docker image build
コマンドを使用します。
docker image buildコマンドの基本
以下は、カレントディレクトリにあるDockerfileを用いてイメージをビルドする基本的なコマンドです。
|
|
このコマンドの各要素の意味は以下の通りです:
build
:Dockerイメージのビルドを実行するサブコマンド-t
:ビルド後のイメージに付けるタグ(任意名とバージョン).
:ビルドコンテキストのパス(後述)
タグを省略した場合、イメージには<none>
という名前が付けられ、後から識別するのが困難になります。開発時には明示的にタグを付けることを推奨します。
|
|
ビルドが成功すると、指定した名前とタグの付いたイメージがローカルに保存されます。
ビルド時に重要な概念
Dockerfileからのイメージビルドでは、以下の3つの概念が特に重要です:
- ビルドコンテキスト
- Dockerfileの配置と指定
- .dockerignoreの活用
ビルドコンテキストとは
docker image build
コマンドで指定するパス(例:.
)は、Dockerfileの場所ではなく「ビルドコンテキスト」と呼ばれるディレクトリを指します。
ビルドコンテキストは、イメージのビルド時にDockerが必要とするファイル群のルートディレクトリです。
このコンテキストに含まれるファイルがDockerデーモンに送られ、イメージの構築に使用されます。
|
|
この例では、カレントディレクトリ(.
)がビルドコンテキストです。Dockerfileだけでなく、ビルドに使用するファイル(COPY対象など)もこのディレクトリに含まれている必要があります。
DockerデーモンとCLIの関係
CLIでのビルド命令は内部的にはREST API経由でDockerデーモンに送信されます。
そのため、Dockerデーモンが別マシンにある場合でも、ローカルのCLIからリモートでビルドを実行できます。
この構造上、ビルド時にはコンテキスト全体がデーモンに転送されるため、不要なファイルを含めない設計が重要です。
Dockerfileの配置と指定
Dockerfileは通常、ビルドコンテキストのルートディレクトリに配置します。
この場合、docker image build
は自動的にDockerfile
を読み取ります。
別の場所にある場合は、-f
オプションでパスを指定します。
|
|
この例では、Dockerfileが./Dockerfile
、ビルドコンテキストが./app
です。
両者は同じディレクトリにある必要はありません。
.dockerignoreの活用
ビルドに不要なファイルを除外するには、.dockerignore
ファイルを使用します。
*.log
node_modules/
secret.env
.dockerignore
はビルドコンテキストのルートに配置し、不要なファイルを除外してビルド効率を高めます。
記述方法は.gitignore
と似ていますが、対象はDockerデーモンへの転送内容です。
Dockerfileの基本命令
Dockerfileでは、以下のような命令を用いてイメージ構築の手順を定義します。
FROM:ベースイメージの指定
|
|
イメージの土台となるベースイメージを指定します。Dockerfileは原則としてこの命令から始まります。
RUN:ビルド時のコマンド実行
|
|
ビルド中に必要なコマンドを実行します。-y
オプションを付けて非対話的にすることが重要です。
COPYとADD:ファイルコピー
|
|
COPYは単純なコピーに使います。ADDはURLからの取得やアーカイブ展開など追加機能がありますが、用途が限定されます。
CMDとENTRYPOINT:起動時のコマンド指定
|
|
CMDは上書き可能、ENTRYPOINTは常に実行され、CMDはその引数になります。
WORKDIR:作業ディレクトリの指定
|
|
以降の命令の作業ディレクトリを指定します。存在しない場合は自動作成されます。
ENVとARG:変数の利用
|
|
ENVはビルド時と実行時両方で有効、ARGはビルド時のみ有効です。
LABEL:メタ情報の追加
|
|
イメージに付加情報を設定できます。docker image inspect
で確認可能です。
EXPOSE:公開ポートの指定
|
|
コンテナ実行時のポート公開を示唆しますが、実際には-p
オプションが必要です。
応用:マルチステージビルド
マルチステージビルドでは、1つのDockerfile内に複数のステージを定義し、ビルド用と実行用の環境を分離できます。
|
|
これにより、不要なツールや一時ファイルを本番イメージに含めず、サイズやセキュリティを最適化できます。
環境切り替えの例
|
|
|
|
1つのDockerfileで開発環境と本番環境を切り替えて管理できます。
まとめと活用のポイント
- DockerfileはDockerイメージの設計図
docker image build
コマンドで再現性のあるイメージを作成- ビルドコンテキストや
.dockerignore
を適切に設計して効率化 - 命令(FROM, RUN, COPY, CMDなど)の意味を理解し使い分ける
- マルチステージビルドにより、軽量・安全なイメージを構築可能
Dockerfileの理解と活用は、開発・運用の品質向上に直結します。基本を押さえたうえで、実践を通じて自分に合った最適な構築手法を見つけていきましょう。