Day11:本番用Dockerfile(中盤)
テーマ:マルチステージビルドの“効果を体感する”——軽量化・安全性・実務メリットを深く理解する
中盤では、前半で学んだ
「ビルド用ステージ」と「本番用ステージ」を分ける意味
を、実際の動作・サイズ比較・セキュリティ観点から深掘りします。
ここを理解すると、あなたは
「なぜ本番用 Dockerfile はマルチステージが必須なのか」
を論理的に説明できるようになります。
マルチステージビルドの効果を“数字で理解する”
1. イメージサイズが劇的に小さくなる
Node.js の場合、よくある比較は次の通りです。
node:18(フル版)
→ 約 1GBnode:18-slim(軽量版)
→ 約 150MBnode:18-alpine(超軽量版)
→ 約 50MB
マルチステージビルドを使うと、
最終イメージを slim や alpine にできるため、サイズが 1/10 以下になることも普通 です。
なぜこんなに差が出るのか
フル版には以下が含まれます。
- ビルドツール(gcc, make など)
- npm のキャッシュ
- OS の不要パッケージ
- ドキュメント類
本番環境には不要なものばかりです。
マルチステージでは、
これらをすべて build ステージに閉じ込め、runtime ステージには持ち込まない
ため、極端に軽くなります。
セキュリティ面でのメリットを深掘りする
1. 攻撃対象(Attack Surface)が減る
本番イメージに余計なツールが残っていると、
攻撃者が悪用できる“入口”が増えます。
例:
- curl / wget が残っている → 外部に通信される可能性
- gcc が残っている → コンテナ内で悪意あるコードをコンパイルされる
- npm が残っている → 任意パッケージをインストールされる
マルチステージビルドでは、
本番イメージに実行に必要な最低限のファイルしか残らない
ため、攻撃リスクが大幅に減ります。
2. 脆弱性スキャンで警告が減る
セキュリティツール(Trivy など)は、
イメージ内のパッケージをスキャンして脆弱性を検出します。
フル版イメージはパッケージが多いため、
脆弱性の数が増えやすい。
slim や alpine を使うと、
パッケージ数が少ないため、
脆弱性の検出数が激減する
という実務的メリットがあります。
実際にマルチステージでビルドしたときの流れを理解する
Dockerfile(言語:Dockerfile)
# --- ビルドステージ ---
FROM node:18 AS build
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
# --- 実行ステージ ---
FROM node:18-slim
WORKDIR /app
COPY --from=build /app /app
CMD ["node", "app.js"]
Dockerfileビルド時に起きていること
- build ステージが作られる
- npm install
- ソースコードコピー
- 必要ならビルド(React など)
- runtime ステージが作られる
- node:18-slim をベースにする
- build ステージから成果物だけコピー
- 最終イメージは runtime ステージのみ
→ build ステージのファイルは一切残らない
つまり
“重い作業は build ステージに閉じ込め、
本番イメージは軽くて安全な状態にする”
という構造が完成します。
マルチステージビルドが実務で必須になる理由
1. CI/CD で高速化できる
GitHub Actions や GitLab CI で Docker ビルドを行う場合、
イメージが軽いほどビルド時間が短くなります。
軽いイメージ
→ プッシュ・プルが速い
→ デプロイが速い
→ コストも下がる
2. クラウド環境での起動が速い
AWS ECS / Cloud Run / Azure Container Apps などでは、
イメージサイズが小さいほど起動が速くなります。
特にサーバレス系(Cloud Run)は
起動速度=ユーザー体験
に直結します。
3. チーム開発での再現性が高い
ビルド環境と実行環境が分離されているため、
「ローカルでは動くのに本番で動かない」
という問題が激減します。
中盤まとめ
あなたがここまで理解できていれば、中盤はクリアです。
- マルチステージビルドは 軽量化・安全性向上 に直結する
- フル版 → slim で 1GB → 150MB など劇的に軽くなる
- 不要なツールが残らないため 攻撃対象が減る
- 脆弱性スキャンの警告が減る
- CI/CD やクラウドで 高速・低コスト
- 実務ではほぼ必須のテクニック

