こんにちは!Dockerを使った開発をしていると、どうしてもイメージサイズが大きくなってしまうことってありますよね。
「ビルドに必要なツールも含めるとイメージが数GBになってしまう…」
「本番環境には不要なファイルまで入ってしまっている…」
そんな悩みを解決してくれるのが、マルチステージビルドという仕組みです!
この技術について詳しく学ぶなら、徳永航平さんの「[改訂新版]イラストでわかるDockerとKubernetes」がとてもおすすめです。イラストを使って分かりやすく解説されているので、マルチステージビルドの仕組みがスッと理解できますよ。
今回は、この書籍を参考にしながら、マルチステージビルドの仕組みと実践例について詳しく見ていきましょう!
マルチステージビルドで解決できる課題
Dockerイメージサイズの問題
Dockerを使っていて一番困るのが、イメージサイズが大きくなってしまうことですよね。
特に以下のような状況でサイズが膨らみがちです:
- コンパイル言語(Go、Rust、Java等)のアプリケーション開発
- フロントエンドのビルドツール(webpack、npm等)を使用
- 複数の開発ツールやライブラリが必要な場合
例えば、Go言語のアプリケーションをビルドする場合、Go SDKや各種ツールを含めると軽く1GB以上になってしまうことも珍しくありません。
ビルドツールによる不要なファイル増加
従来のDockerfileでは、ビルドに必要なツールと実行時に必要なファイルが同じイメージに含まれてしまいます。
具体的には:
- コンパイラやビルドツール
- ソースコード
- 中間ファイルやキャッシュ
- パッケージマネージャーのメタデータ
これらは実行時には全く不要なのに、イメージサイズを圧迫してしまうんです。
セキュリティリスクの軽減
不要なツールやライブラリが残っていると、セキュリティ面でもリスクになります。
攻撃者に悪用される可能性のあるコンポーネントを減らすことで、よりセキュアなコンテナ環境を構築できるのが大きなメリットです。
マルチステージビルドの基本概念
従来の単一ステージビルドとの違い
従来の方法では、1つのDockerfileで「ビルド」と「実行」の両方を行っていました。
# 従来の方法(単一ステージ)
FROM golang:1.19
WORKDIR /app
COPY . .
RUN go build -o main .
CMD ["./main"]
この場合、Go SDKやビルドツール全てが最終イメージに含まれてしまいます。
ステージ分離による最適化の仕組み
マルチステージビルドでは、複数のFROM文を使って段階的にイメージを作成します。
# マルチステージビルドの例
# ステージ1: ビルド環境
FROM golang:1.19 AS builder
WORKDIR /app
COPY . .
RUN go build -o main .
# ステージ2: 実行環境
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/main .
CMD ["./main"]
最終イメージには、必要なファイルだけがコピーされるんです!
実行環境とビルド環境の分離メリット
この分離により、以下のような大きなメリットがあります:
- 大幅なサイズ削減: 数GBから数十MBまで削減可能
- セキュリティ向上: 不要なツールの除去
- デプロイ効率化: 軽いイメージで高速配布
- 保守性向上: 役割が明確に分離される
「イラストでわかるDockerとKubernetes」で学ぶマルチステージビルド
この技術について体系的に学ぶなら、徳永航平さんの「[改訂新版]イラストでわかるDockerとKubernetes」が本当におすすめです!
書籍で解説されるマルチステージビルドの特徴
この書籍の第2章「Dockerの概要」では、マルチステージビルドについて以下のポイントで詳しく解説されています:
- 基本的な文法と書き方: FROM文の使い分け方法
- 実践的な例: 実際のアプリケーションでの適用例
- 最適化テクニック: より効率的なビルド方法
特に、改訂新版では最新のベストプラクティスも含まれているので、実務でそのまま活用できる内容になっています。
イラストで理解するレイヤ構造の最適化
書籍の大きな特徴は、豊富なイラストによる解説です。
Dockerのレイヤ構造は概念として理解しにくい部分がありますが、この書籍では:
- ビルドステージでのレイヤ構成
- 最終イメージに含まれるレイヤの違い
- COPYコマンドでのファイル移動の仕組み
これらが視覚的に理解できるよう、分かりやすいイラストで説明されているんです。
実践的なDockerfile作成例
理論だけでなく、実際に使えるDockerfileの例も豊富に掲載されています。
言語別の最適化パターンや、よくあるトラブルシューティングも含まれているので、初心者の方でも安心して学習を進められますよ!
マルチステージビルドの実装パターン
基本的なマルチステージDockerfile
最もシンプルなパターンから見ていきましょう:
# ビルドステージ
FROM node:16 AS build
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
# プロダクションステージ
FROM nginx:alpine
COPY --from=build /app/dist /usr/share/nginx/html
この例では:
- Node.jsでフロントエンドをビルド
- 生成されたファイルのみをNginxイメージにコピー
結果として、Node.jsの実行環境やnode_modulesは最終イメージに含まれません!
言語別最適化テクニック
Go言語の場合:
FROM golang:1.19 AS builder
WORKDIR /app
COPY go.* ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o main .
FROM scratch
COPY --from=builder /app/main /main
ENTRYPOINT ["/main"]
scratchイメージを使うことで、究極に軽いイメージが作れます!
Java(Spring Boot)の場合:
FROM maven:3.8-openjdk-17 AS build
WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offline
COPY src ./src
RUN mvn clean package -DskipTests
FROM openjdk:17-jre-slim
COPY --from=build /app/target/app.jar /app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]
「[改訂新版]イラストでわかるDockerとKubernetes」では、こうした言語別の実践的なパターンも詳しく解説されているので、自分の開発環境に合わせて学習できます。
パフォーマンス向上のコツ
マルチステージビルドを効率的に使うためのコツもいくつかあります:
- レイヤーキャッシュの活用: 依存関係のインストールを先に実行
- 並列ビルド: 複数のビルドステージを並列実行
- 不要ファイルの除外: .dockerignoreファイルの活用
これらのテクニックについても、書籍では実例を交えて詳しく説明されています。
この書籍がおすすめな理由
イラスト豊富で理解しやすい解説
技術書によくある「文字ばかりで読みにくい」ということがありません。
複雑なDockerの内部動作やコンテナの仕組みが、イラストと図解で直感的に理解できるよう工夫されています。
特にマルチステージビルドの部分では、各ステージでの処理内容やファイルの移動が視覚的に分かるので、「なるほど!こういう仕組みなのか」と腑に落ちる瞬間がありますよ。
実務に直結する実践例
理論的な説明だけでなく、実際の開発現場で使えるノウハウが豊富です。
- 効率的なDockerfileの書き方
- トラブルシューティングのコツ
- パフォーマンス最適化のポイント
これらが実例とセットで学べるので、読み終わったらすぐに実務で活用できます!
初心者から中級者まで対応
Dockerを始めたばかりの方でも読みやすい構成になっている一方で、すでにDockerを使っている方にも新しい発見がある内容です。
改訂新版では、最新のDockerの機能やベストプラクティスも含まれているので、知識のアップデートにもぴったりですね。
著者の徳永航平さんは、CNCF containerdのレビュワやMobyプロジェクトのBuildKitメンテナを務めている第一人者なので、内容の信頼性も抜群です。
まとめ:効率的なDocker運用を始めよう
マルチステージビルドは、Dockerを使った開発で避けて通れない重要な技術です。
この仕組みを理解することで:
- 大幅なイメージサイズ削減が可能になる
- セキュリティ向上が図れる
- デプロイ効率が向上する
- 保守性の高いDockerfileが書ける
「[改訂新版]イラストでわかるDockerとKubernetes」は、これらの技術を体系的に学ぶのに最適な一冊です。
マルチステージビルドだけでなく、DockerやKubernetesの基礎から応用まで幅広くカバーされているので、コンテナ技術全般のスキルアップにも役立ちます。
Dockerでの開発をより効率的に進めたい方は、ぜひ読んでみることをおすすめします!
イメージサイズで悩んでいる方、Docker運用を最適化したい方は、まずはマルチステージビルドから始めてみてくださいね。きっと「なんでもっと早く知らなかったんだろう」と思うはずですよ!

コメント