Dockerfileは、Dockerイメージの設計図です。少しの工夫でイメージサイズを小さくしたり、ビルドを高速化することができます。この記事では、基本構文からよく使う命令、軽量化のコツ、そしてマルチステージビルドの実践例まで、初心者〜中級者向けにやさしく解説します。
Dockerfileの基本構文
Dockerfileは命令が1行ずつ上から順に実行されていきます。それぞれの命令はレイヤーとして積み重なり、キャッシュとして再利用される仕組みになっています。このレイヤー構造を理解し、変更の少ない命令を先に記述することで、無駄なビルドを避けて時間を短縮できます。命令の順序や構成の工夫により、より軽量かつ効率的なDockerイメージを作成することが可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# ベースイメージの指定 FROM node:20 # 作業ディレクトリを指定 WORKDIR /app # package.jsonとpackage-lock.jsonをコピー COPY package*.json ./ # 依存パッケージのインストール RUN npm install # ソースコードをコピー COPY . . # ポート開放 EXPOSE 3000 # 起動コマンド CMD ["npm", "start"] |
よく使う命令と書き方
FROM
:ベースとなるイメージ(OSやランタイム)を指定WORKDIR
:作業ディレクトリを設定。以降の命令はこのディレクトリ内で実行COPY
:ファイルやディレクトリをコンテナ内にコピーRUN
:イメージ作成時に一度だけ実行。パッケージインストールなどCMD
:コンテナ起動時に実行されるデフォルトコマンドENTRYPOINT
:CMDに渡された値を引数として使う固定コマンド。再利用性の高い起動処理に活用EXPOSE
:アプリケーションがリッスンするポート番号を定義(実際のポート開放は docker run の -p オプション)
Dockerfileにはさまざまな命令があり、それぞれの役割を正しく理解することが重要です。
たとえばFROM
はベースイメージを指定し、WORKDIR
で作業ディレクトリを設定します。COPY
やRUN
はファイルコピーやスクリプト実行を行いますが、順番次第でキャッシュの効き方が変わります。特にCMD
とENTRYPOINT
の違いは混同されやすく、CMDは実行時の引数、ENTRYPOINTは実行コマンドの本体という役割があります。
イメージを軽くするTips
軽量なDockerイメージを作ることで、ビルドやデプロイの速度向上、セキュリティリスクの低減、リソースの節約など多くのメリットがあります。まず、ベースイメージにはalpine
やslim
などの軽量版を使うことが基本です。.dockerignore
を設定して無関係なファイルを除外することで、無駄な容量とビルド時間を減らせます。さらに、COPY
やRUN
の順序にも注意を払い、キャッシュが最大限活用されるように工夫しましょう。不要ファイルの削除も忘れずに。
- 軽量ベースイメージを選ぶ:
node:20-slim
やalpine
系のイメージを使うとサイズが劇的に減少 - .dockerignore を活用:
node_modules
や.git
など不要なファイルは除外 - COPYとRUNの順序に注意:キャッシュを効かせるため、package.json → install → ソースコードの順で
- 不要なキャッシュ削除:
apt-get clean
やrm -rf /var/lib/apt/lists/*
でパッケージ後の不要データ削除
マルチステージビルドとは?
マルチステージビルドとは、1つのDockerfile内で複数のステージ(FROM
)を定義し、それぞれに役割を持たせて構築を進める手法です。最初のステージでビルドやテストなどの重い処理を行い、最終ステージでは必要なファイルのみを取り出して軽量なイメージを作成します。
これにより、本番環境には不要な依存やツールを含めずに済み、セキュリティやパフォーマンス面でも大きなメリットがあります。
実践:Node.jsアプリのマルチステージ例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# ビルドフェーズ FROM node:20 AS builder WORKDIR /app COPY package*.json ./ RUN npm ci COPY . . RUN npm run build # 実行フェーズ(軽量イメージ) FROM node:20-slim WORKDIR /app COPY --from=builder /app/dist ./dist COPY --from=builder /app/package*.json ./ RUN npm install --omit=dev EXPOSE 3000 CMD ["node", "dist/index.js"] |
Node.jsアプリケーションのマルチステージビルドでは、まず最初のステージで依存パッケージのインストールやビルド処理を行い、その成果物だけを本番用のイメージにコピーします。
たとえば、npm ci
やnpm run build
を使ってdist
フォルダを生成し、軽量なnode:20-slim
イメージに必要なファイルだけをCOPY --from
で転送します。さらにnpm install --omit=dev
を使えば、開発依存を省いた状態で本番に適した構成が完成します。
まとめ
- Dockerfileは命令の順序や構成により性能・サイズが大きく変わる
- よく使う命令(COPY・RUN・CMDなど)の理解が第一歩
- マルチステージビルドを使えば本番環境向けの軽量化が実現
次回は、ENTRYPOINTやHEALTHCHECKなど応用的な命令や、スクリプトを使ったコンテナ起動制御について掘り下げていきます!
新着情報
ブログランキングに参加しています。クリックして応援していただけると嬉しいです。
人気ブログランキング
にほんブログ村