Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】🐳 Mastering Dockerfile: A Complete Beginner’s Guide to Building Containers

2025年09月14日に「Dev.to」が公開したITニュース「🐳 Mastering Dockerfile: A Complete Beginner’s Guide to Building Containers」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

Dockerfileは、Dockerイメージを構築するための手順を記述するテキストファイルだ。これにより、アプリケーションが動作する環境(コンテナ)を定義し、どこでも同じように実行できる。基本構造や命令、効率的な書き方を学ぶことで、コンテナ開発の基礎を習得できる。

ITニュース解説

Dockerは、現代のソフトウェア開発において不可欠なツールの一つであり、特にDevOpsやクラウドネイティブな環境でその真価を発揮する。アプリケーションとその実行環境をまとめてパッケージ化し、どこでも一貫して動作させることを可能にするのがDockerの大きな特徴である。このDockerの中心にあるのがDockerfileである。Dockerfileは、Dockerイメージを構築するための手順を記述した、まるで料理のレシピのようなテキストファイルだ。

Dockerfileは、一行ごとに特定の命令が書かれており、Dockerはその命令を上から順に処理していく。この処理の結果として「Dockerイメージ」が生成される。Dockerイメージは、アプリケーションと、それを実行するために必要なすべてのもの(コード、ランタイム、システムツール、ライブラリなど)を一つのまとまりとして含んだ、読み取り専用のテンプレートのようなものだ。そして、このDockerイメージを実行したものが「コンテナ」と呼ばれる。コンテナは、イメージを基にした実行中のインスタンスであり、軽量で独立した環境でアプリケーションを動作させる。この一連の流れは、「Dockerfile → Dockerイメージ → コンテナ」というシンプルなサイクルで理解できる。

Dockerfileの基本的な構造と主要な命令について詳しく見ていこう。まず、すべてのDockerfileは「FROM」命令から始まる必要がある。これは、ビルドするイメージの土台となる「ベースイメージ」を指定するものだ。例えば、「FROM python:3.9-slim」と書くことで、Python 3.9の軽量版がインストールされた環境を土台として利用できる。

次に、「WORKDIR」命令は、コンテナ内で以降のコマンドが実行される際の作業ディレクトリを設定する。これにより、ファイルパスの指定が簡潔になり、コンテナ内の構成が明確になる。例えば、「WORKDIR /app」と指定すれば、以降の操作はコンテナ内の/appディレクトリで行われることになる。

「COPY」命令は、ローカルマシン上にあるファイルやディレクトリを、ビルド中のDockerイメージ内にコピーするために使用する。アプリケーションのソースコードや設定ファイルなどをコンテナに持ち込む際に使う重要な命令だ。例えば、「COPY requirements.txt .」は、ローカルのrequirements.txtファイルをコンテナの現在の作業ディレクトリ(WORKDIRで指定した場所)にコピーする。「COPY . .」と書けば、カレントディレクトリのすべての内容をコピーできる。

「RUN」命令は、Dockerイメージのビルド中にコマンドを実行する。これは、コンテナ環境内で必要なソフトウェアのインストールや、ファイルのコンパイル、データベースの初期設定など、イメージを構成するために必要なあらゆる処理を行うために使われる。例えば、Pythonの依存関係をインストールするために「RUN pip install -r requirements.txt」のようなコマンドを実行する。この命令によって実行された結果は、イメージのレイヤーとして保存される。

「CMD」命令は、コンテナが起動したときにデフォルトで実行されるコマンドを指定する。これは、コンテナの主な目的であるアプリケーションの起動コマンドを指定することが多い。例えば、「CMD ["python", "app.py"]」と書くと、コンテナが起動するたびにpython app.pyが実行される。CMDは、docker runコマンドの引数によって簡単に上書きできる点が特徴だ。

「ENTRYPOINT」命令もCMDと同様にコンテナ起動時に実行されるコマンドを指定するが、CMDと比べて上書きされにくいという違いがある。ENTRYPOINTはコンテナの主要な実行ファイルとして機能し、CMDはそのENTRYPOINTに渡される引数として利用されることが多い。例えば、「ENTRYPOINT ["python"]」と「CMD ["app.py"]」を組み合わせると、コンテナは常にpythonコマンドを実行し、その引数としてapp.pyが渡される。

「EXPOSE」命令は、コンテナがリッスンする(外部からの接続を受け入れる)ポートを文書化する。これはあくまでドキュメントとしての役割が主であり、実際にそのポートを公開するにはdocker run -pコマンドを使用する必要がある。例えば、「EXPOSE 5000」と書くことで、このコンテナがポート5000でサービスを提供することを開発者に示す。

「ENV」命令は、コンテナ内で使用する環境変数を設定する。これにより、アプリケーションが動作する環境に応じて設定を柔軟に変更できる。例えば、「ENV APP_ENV=production」と設定すれば、アプリケーションはAPP_ENVという環境変数の値としてproductionを利用できる。

最後に、「ARG」命令は、Dockerイメージのビルド時にのみ利用できる変数を設定する。これは、イメージのビルドプロセスで一時的に利用したい情報がある場合に便利だ。例えば、「ARG VERSION=1.0」と設定し、ビルドコマンドでdocker build --build-arg VERSION=2.0 .のように値を渡すことができる。

具体的な例として、Python FlaskアプリケーションのDockerfileを見てみよう。まず、ベースイメージとしてpython:3.9-slimを選択し、作業ディレクトリを/appに設定する。次に、requirements.txtをコピーし、pip installコマンドで依存関係をインストールする。その後に残りのアプリケーションコードをコピーし、ポート5000を公開することを宣言する。最後に、コンテナ起動時にpython app.pyが実行されるようにCMDを設定する。このように、一連のステップを経て、アプリケーションが動作するためのDockerイメージが完成する。

このDockerfileが完成したら、次のステップはイメージをビルドし、コンテナとして実行することだ。イメージのビルドはdocker build -t myapp:1.0 .というコマンドで行う。-tオプションはイメージに名前とタグ(バージョン)を付けるために使い、myapp:1.0は「myapp」という名前でバージョン「1.0」のイメージを作成するという意味だ。コマンドの末尾の.は、現在のディレクトリにあるDockerfileを使ってビルドすることを指示している。イメージがビルドされたら、docker run -p 5000:5000 myapp:1.0というコマンドでコンテナを実行できる。-p 5000:5000は、ホストマシン(あなたのPC)のポート5000とコンテナのポート5000をマッピングし、外部からアプリケーションにアクセスできるようにする。これにより、http://localhost:5000にアクセスすれば、コンテナ内で動作しているアプリケーションにアクセスできるようになる。

Dockerfilesを作成する際には、いくつかのベストプラクティスを考慮すると良い。一つは、常に軽量なベースイメージ(例えばalpineslimタグを持つイメージ)を使用することだ。これにより、イメージサイズを小さく保ち、ダウンロード時間や起動時間を短縮できる。また、.dockerignoreファイルを使用して、ビルド時に不要なファイル(例えば.gitディレクトリや一時ファイル)がイメージにコピーされないようにすることも重要である。これにより、ビルド速度が向上し、イメージサイズも小さくなる。複数のRUNコマンドを&&で繋いで一つにまとめることで、生成されるイメージのレイヤー数を減らし、最終的なイメージサイズを最適化することもできる。さらに、依存関係のバージョンは明確に固定することで、再現性のあるビルドを保証する。

高度なテクニックとして「マルチステージビルド」がある。これは、ビルドプロセスを複数のステージに分け、最終的なイメージには最終ステージで生成された実行可能なファイルや必要なライブラリだけを含める方法だ。例えば、Go言語のアプリケーションの場合、まず最初のステージでGoコンパイラを含むイメージを使い、ソースコードから実行ファイルをビルドする。次に、非常に軽量なベースイメージ(例: alpine)を使って新しいステージを開始し、前のステージでビルドした実行ファイルだけをコピーして最終的なイメージとする。これにより、開発ツールやビルドに必要な中間ファイルが最終的なイメージに含まれなくなり、イメージサイズを大幅に削減できる。

このように、Dockerfileは、アプリケーションをコンテナ化するための設計図であり、数々のシンプルな命令を組み合わせることで、開発者がコードをパッケージ化し、あらゆる環境で一貫して実行することを可能にする。これは、現代のソフトウェア開発において、効率性と再現性を高めるための強力な手段である。

関連コンテンツ

関連IT用語