これまではイメージからDockerコンテナを作成する方法を見てきました。
今回は、もう少し複雑な環境を作りたい際に便利なDockerfileについて紹介します。
Dockerfileは、Dockerイメージを構築するための設計図のようなものです。コンテナ化するアプリケーションやサービスの環境を定義し、その定義に基づいてDockerイメージを作成することができます。この記事では、Dockerfileの基本構造とその使い方について詳しく解説します。
Dockerfileの役割
Dockerfileは、イメージ作成のための一連のコマンドが記述されたファイルです。ソースコードや依存関係、実行環境を自動的にセットアップするため、アプリケーションの配布やデプロイを効率的に行うことができます。
Dockerfileの主な役割:
- アプリケーションの実行環境を一貫して構築できる
- インフラの構成をコード化し、バージョン管理が可能
- 手動設定を減らし、自動化を推進
Dockerfileの基本構造
Dockerfileは一連の命令から構成されています。代表的な命令とその役割を見てみます。
FROM(ベースイメージの指定)
FROM
命令は、どのベースイメージからスタートするかを指定します。Dockerイメージは、このベースイメージを元に追加の設定やインストールが行われます。
FROM python:3.12
上記の例では、Python 3.12をベースとしたイメージを使用します。
WORKDIR(作業ディレクトリの設定)
WORKDIR
命令は、コンテナ内で作業するディレクトリを指定します。このディレクトリは、以降の命令で使用されるデフォルトの作業ディレクトリになります。
WORKDIR /app
COPY(ファイルやディレクトリのコピー)
COPY
命令は、ローカルマシンのファイルやディレクトリをコンテナにコピーするために使います。
COPY . .
この例では、現在のディレクトリの全ファイルをコンテナの/app
ディレクトリにコピーしています。
RUN(コマンドの実行)
RUN
命令は、イメージのビルド中にコマンドを実行します。通常、ソフトウェアのインストールや環境設定に使用します。
RUN pip install --no-cache-dir -r requirements.txt
この例では、Pythonパッケージをrequirements.txt
ファイルに基づいてインストールしています。
CMD(コンテナ実行時のデフォルトコマンド)
CMD
命令は、コンテナが起動した際に実行されるデフォルトのコマンドを指定します。CMD
はイメージのビルド時には実行されず、コンテナ起動時に実行されます。
CMD ["python", "app.py"]
この例では、コンテナが起動するとpython app.py
が実行されます。
Dockerfileの例
ここでは、Pythonアプリケーションをコンテナ化するためのシンプルなDockerfileの例を示します。
# ベースイメージとしてPython 3.12を使用
FROM python:3.12
# 作業ディレクトリを設定
WORKDIR /app
# ローカルのファイルをコンテナにコピー
COPY . .
# 依存パッケージをインストール
RUN pip install --no-cache-dir -r requirements.txt
# コンテナ起動時に実行されるコマンドを指定
CMD ["python", "app.py"]
このDockerfileを使うことで、Python 3.12環境がセットアップされ、必要なパッケージがインストールされた状態でアプリケーションapp.py
が実行されるコンテナを作成することができます。
DockerfileからDockerイメージをビルドする
Dockerfileが準備できたら、docker build
コマンドでDockerイメージをビルドします。
docker build -t my-python-app .
このコマンドは、現在のディレクトリ(.
)にあるDockerfileをもとにmy-python-app
という名前のイメージをビルドします。
Dockerfileの活用ポイント
- キャッシュを活用:
RUN
命令などはキャッシュされるため、変更がない場合はビルドが高速化されます。 - 軽量なベースイメージを選ぶ:不要なライブラリが多く含まれたベースイメージを使うと、イメージのサイズが大きくなるため、軽量なイメージを選びましょう。
- マルチステージビルド:ビルド環境と実行環境を分けることで、最終的なイメージを小さく保つことができます。
まとめ
Dockerfileは、Dockerイメージを作成するための重要なファイルで、アプリケーションの依存関係や設定を自動化し、一貫した実行環境を提供します。Dockerfileを理解し適切に使用することで、効率的な開発・デプロイが可能になります。