Docker イメージ最適化は『3つの軸』で進める
イメージサイズ・ビルド時間・セキュリティの3軸を最適化すると、CI/CD/本番運用が大きく改善します。本記事では編集部の視点で、実践的なテクニックを公開情報をもとに整理します。Docker Compose 実践 もご参考に。
サイズ削減の基本
(1) マルチステージビルド:ビルド成果物だけ本番イメージへ。(2) distroless / alpine:ベースイメージを最小に。(3) 不要ファイル削除:apt cache / pip cache / .git。(4) .dockerignore:node_modules/test/dist 等を除外。(5) レイヤー結合:RUN を結合してレイヤー数を減らす。
ビルド高速化
(1) BuildKit を有効化:並列ビルドとキャッシュ最適化。(2) レイヤー順序:変更頻度低いものを先に。(3) 依存ファースト:package.json/requirements.txt を先にコピー。(4) マウントキャッシュ:RUN --mount=type=cache で外部キャッシュ。(5) ビルドキャッシュ共有:CI で GHCR/ECR にプッシュ。CI/CD 実践 もご参考に。
セキュリティ強化
(1) 非rootユーザー:USER 1000 等で実行。(2) 最小ベースイメージ:attack surface 削減。(3) 脆弱性スキャン:Trivy / Grype を CI で。(4) SBOM 生成:依存性の透明化。(5) イメージ署名:cosign で改ざん検知。Web セキュリティ実践 もご参考に。
マルチアーキ対応
(1) arm64 / amd64両対応:Apple Silicon と x86 サーバー。(2) docker buildx:マルチプラットフォームビルド。(3) QEMU エミュレーション:他アーキを擬似。(4) ネイティブビルダー:両アーキの実機で並列。(5) 選択的タグ:本番タグだけ全アーキ。
言語別の工夫
(1) Node.js:pnpm/yarn のフェッチをキャッシュ層に。(2) Python:pip wheel + uv で高速化。(3) Go:static linking で scratch ベース可能。(4) Java:jlink で JRE を最小化。(5) Rust:cargo-chef でビルドキャッシュ最適化。
失敗しがちなパターン
(1) イメージサイズ数GB:転送/起動が遅い。(2) レイヤーキャッシュが効かない:順序設計ミス。(3) root 実行:脆弱性のリスク。(4) ベースの脆弱性放置:古いイメージ。(5) latest タグ依存:再現性なし。対策は、(1)マルチステージ、(2)依存ファーストCOPY、(3)非root、(4)Watchtower/Renovate、(5)バージョン固定、です。