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ビルド時、デフォルトでは全ファイルが「ビルドコンテキスト」としてデーモンに転送されます。.gitnode_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 > GeneralVirtioFS を選択してください。従来の gRPC FUSE に比べて、ファイル読み書きのパフォーマンスが数倍向上します。

まとめ

Dockerのチューニングは、単なる最適化ではなく**「チーム全員の待ち時間を削る」**という価値ある投資です。

  1. マルチステージビルドでスリム化
  2. .dockerignore で無駄な転送を省く
  3. キャッシュ効率を最大化するDockerfile構成
  4. 軽量ベースイメージの採用
  5. VirtioFS でホストとの同期を高速化

まずは自分のプロジェクトのDockerfileから、一つずつ見直してみましょう!

Discussion