2.1 Dockerfileの基本コンセプト
Dockerfile は、テキストファイル
で、Dockerがイメージを作成するために使用するコマンドのシーケンスが含まれています。それは「レシピ」の役割を果たし、ベース層から最終状態まで、イメージがどのように構成されるべきかを説明します。Dockerfileの構造と作成プロセスを理解することは、Dockerを効率的に使用するために重要です。
Dockerfileの基本コンセプト:
- 冪等性: Dockerfile内のコマンドは冪等であるべきです — 繰り返し実行しても同じ結果が得られます。
- 順序性: コマンドは上から下へと順番に実行されます。順序は重要で、各コマンドは新しい層を作成します。
- 層構造: ほぼすべての命令がイメージに新しい層を追加します。これらの層はキャッシュされ、ビルドプロセスを最適化できます。
Dockerfileの構造:
Dockerfileは、特定の機能を果たす命令で構成されています。以下は主な命令です:
- FROM: 新しいイメージを作成するために使用されるベースイメージを指定します。
- MAINTAINER: Dockerfileの作成者を定義します(非推奨ですが、情報として有用です)。
- RUN: コンテナ内でコマンドを実行し、新しい層を作成します。
- COPY: ビルドコンテキストからコンテナのファイルシステムにファイルやディレクトリをコピーします。
- ADD: ファイルやディレクトリをコピーし、アーカイブの展開やURL経由のファイルダウンロードをサポートします。
- WORKDIR: 後続のコマンドの作業ディレクトリを指定します。
- ENV: 環境変数を設定します。
- CMD: コンテナ起動時に実行されるデフォルトのコマンドを定義します。
- ENTRYPOINT: コンテナ起動時に実行されるコマンドを定義し、引数の受け渡しが可能です。
- EXPOSE: コンテナが使用するポートを指定します。
- VOLUME: 外部ボリュームのマウントポイントを作成します。
2.2 Dockerfileの作成
Dockerfile作成の例
Node.jsのウェブアプリケーション用のシンプルなDockerfile作成例を見てみよう。
ステップ1: 基本的なDockerfileの作成
Dockerfile
という名前のファイルをプロジェクトのルートに作成し、以下のコードを追加しよう:
# Node.jsの基本イメージを使用
FROM node:14
# 作業ディレクトリを設定
WORKDIR /app
# package.json と package-lock.json をコピー
COPY package*.json ./
# 依存関係をインストール
RUN npm install
# プロジェクトのすべてのファイルをコピー
COPY . .
# アプリケーションが使用するポートを指定
EXPOSE 3000
# アプリケーションを起動するコマンドを定義
CMD ["node", "app.js"]
このDockerfileは以下を実行するよ:
- FROM node:14: バージョン14の公式
Node.js
イメージを基本として使用。 - WORKDIR /app: 後続のコマンド用の作業ディレクトリを設定。
- COPY package*.json ./:
package.json
とpackage-lock.json
を作業ディレクトリにコピー。 - RUN npm install:
package.json
から依存関係をインストール。 - COPY . .: プロジェクトのすべてのファイルをコンテナの作業ディレクトリにコピー。
- EXPOSE 3000: アプリケーションがポート3000を使用することを指定。
- CMD ["node", "app.js"]: アプリケーションを起動するコマンドを定義。
ステップ2: イメージのビルド
Dockerfileを作成後、docker build
コマンドを使ってイメージをビルドしよう:
docker build -t my-node-app .
このコマンドは、現在のディレクトリのDockerfileを使ってmy-node-app
という名前のイメージを作成するよ。
ステップ3: コンテナを起動
作成したイメージを基にコンテナを起動するには、docker run
コマンドを使おう:
docker run -d -p 3000:3000 my-node-app
この例では、コンテナをバックグラウンドモードで起動し、コンテナのポート3000をホストマシンのポート3000にマッピングします。これで、http://localhost:3000
でアプリケーションにアクセスできるよ。
2.3 Dockerfileの追加インストラクション
1. 環境変数の設定
ENV
インストラクションを使用して、コンテナ内で利用可能な環境変数を設定できます。
ENV NODE_ENV=production
2. 複数のRUN
コマンドの利用
時には、複数のコマンドを1つのRUN
インストラクションにまとめることで、レイヤー数を減らし、イメージのサイズを小さくし、ビルドを早めることができます。
RUN apt-get update && apt-get install -y \
curl \
git \
&& rm -rf /var/lib/apt/lists/*
便利! コマンドが1行に収まらない場合、\
を使って次の行に続けることができます。この記述は1つのコマンドとして解釈されます。
便利! 1行で複数のコマンドを記述する場合、&&
を使用できます: command1 && command2 && command3
。これにより、複数のコマンドを順番に実行できます。
コマンドの順序を最適化
Dockerのキャッシュを効率的に利用するために、まずは変更される可能性が低いファイル(例えばpackage.json
)をコピーして依存関係をインストールし、その後でプロジェクトの他のファイルを追加します。
高度なDockerfileの例
より複雑なプロジェクトでは、追加の設定を含む発展的なDockerfileが必要になる場合があります。
# 最小のNode.jsベースイメージを使用
FROM node:14-alpine
# 作業ディレクトリを設定
WORKDIR /usr/src/app
# package.jsonをコピーして依存関係をインストール
COPY package*.json ./
RUN npm install --only=production
# ソースコードをコピー
COPY . .
# 使用するポートを指定
EXPOSE 8080
# 環境変数を設定
ENV NODE_ENV=production
# アプリを起動
CMD ["node", "server.js"]
GO TO FULL VERSION