⚡
Dockerビルドが遅い?今すぐ見直すべきパフォーマンスチューニング5選
Dockerを利用していて、「ビルドが終わらない」「コンテナの動作が重い」と感じたことはありませんか?
開発環境の快適さは、エンジニアの生産性に直結します。今回は、今日から実践できるDockerのパフォーマンスチューニング手法を5つ厳選して紹介します。
1. マルチステージビルドでイメージを極限まで削る
「ビルド用」と「実行用」のイメージを分けることで、最終的なイメージサイズを劇的に軽量化できます。ビルドツールを実行環境に残さないことは、セキュリティ向上にもつながります。
# --- ビルドステージ ---
FROM node:20 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
# --- 実行用ステージ ---
FROM node:20-slim
WORKDIR /app
# ビルド成果物(dist)だけをコピーして軽量化
COPY --from=builder /app/dist ./dist
CMD ["node", "dist/main.js"]
2. .dockerignore を適切に設定する
Dockerビルド時、デフォルトでは全ファイルが「ビルドコンテキスト」としてデーモンに転送されます。.git や node_modules が含まれると、転送だけで時間を大幅にロスします。
プロジェクトルートに以下の内容で .dockerignore を作成しましょう。
.dockerignore
.git
node_modules
dist
.env
npm-debug.log
3. レイヤーキャッシュを意識した COPY 順序
Dockerは命令ごとにキャッシュを生成します。頻繁に書き換えるソースコードよりも、変更頻度の低い依存関係(package.jsonなど)を先に処理させるのが鉄則です。
# ❌ 悪い例:ソースを直すたびに npm install が走る
COPY . .
RUN npm install
# ✅ 良い例:package.json が変わらない限り install はスキップされる
COPY package*.json ./
RUN npm install
COPY . .
4. ベースイメージの選定(Alpine or Distroless)
特別な理由がない限り、フルセットのOSイメージ(ubuntu など)ではなく、最小限のベースイメージを選択しましょう。
-
Alpine: 5MB程度の超軽量Linux。
python:3-alpineのように指定します。 - Distroless: 実行に必要な最小限のバイナリのみを含む、Google提供のセキュアなイメージです。
5. ローカル開発環境の I/O 高速化(Mac/Windows)
MacやWindowsでDockerが重い最大の要因はファイル共有です。Docker Desktopの設定を見直すだけで劇的に改善します。
-
VirtioFSの有効化:
Settings > Generalで VirtioFS を選択してください。従来のgRPC FUSEに比べて、ファイル読み書きのパフォーマンスが数倍向上します。
まとめ
Dockerのチューニングは、単なる最適化ではなく**「チーム全員の待ち時間を削る」**という価値ある投資です。
- マルチステージビルドでスリム化
- .dockerignore で無駄な転送を省く
- キャッシュ効率を最大化するDockerfile構成
- 軽量ベースイメージの採用
- VirtioFS でホストとの同期を高速化
まずは自分のプロジェクトのDockerfileから、一つずつ見直してみましょう!
Discussion