効率化のためのマルチステージビルド
ビルド時と実行時の依存関係を分離し、より小さく安全な本番イメージを作成するマルチステージビルドを活用します。
「効率化のためのマルチステージビルド」はCoddyKit上の無料Docker & DevOps Fundamentalsレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはDocker & DevOps Fundamentals学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Docker & DevOps Fundamentalsコースには全4レッスンが含まれています。
マルチステージビルドの概要
高度なDockerfile最適化へようこそ。今日は、より小さく効率的なDockerイメージを作成する強力な手法、マルチステージビルドについて学びます。
イメージを小さくすると、ダウンロードが速くなり、セキュリティが向上し、リソースをより有効に利用できます。

イメージを小さくする重要性
Dockerイメージをビルドすると、最終的なアプリケーションの実行時には不要で、ビルド中にだけ必要なツールや依存関係が含まれることがあります。
- プルの高速化:小さいイメージほど短時間でダウンロードできます。
- ディスク容量の削減:レジストリやホストで使用するストレージを節約できます。
- 攻撃対象領域の縮小:コンポーネントが少ないほど、潜在的な脆弱性も少なくなります。
- セキュリティの向上:本番用イメージには必要不可欠なものだけが含まれます。
シングルステージの問題
Goで書かれたものなど、コンパイル型のアプリケーションを考えてみましょう。従来のシングルステージDockerfileでは、Goコンパイラー全体と開発用の依存関係が最終イメージに含まれてしまいます。
コンパイル済みのバイナリを実行するためにコンパイラーは必要ないため、最終イメージが必要以上に大きくなります。
シングルステージの例(Go)
これは、シングルステージでビルドするシンプルなGoアプリケーションとDockerfileです。ビルド環境が最終イメージに含まれていることに注目してください。
main.go:
package main
import "fmt"
func main() {
fmt.Println("Hello from Single-Stage Docker!")
}シングルステージDockerfile
このDockerfileでは、ベースとして`golang:1.21-alpine`を使用します。アプリケーションをビルドした後も、この大きなベースイメージとすべてのビルドツールが最終イメージに残ります。
FROM golang:1.21-alpine
WORKDIR /app
COPY main.go .
RUN go build -o myapp main.go
EXPOSE 8080
CMD ["./myapp"]マルチステージビルドの構造
マルチステージビルドでは、1つのDockerfile内に複数の`FROM`命令を定義することで、この問題を解決します。それぞれの`FROM`が新しいビルドステージを開始します。
ASキーワードを使ってステージに名前を付けます(例:FROM golang:1.21-alpine AS builder)。COPY --from=<stage_name>を使うと、前のステージからアーティファクトをコピーできます。
イメージとして保存されるのは、最後のステージだけです。
マルチステージの構成
一般的なマルチステージDockerfileには、少なくとも2つのステージがあります。
- ビルドステージ:アプリケーションのコンパイルに必要なすべてのツールとソースコードを含みます。
- ランタイムステージ:コンパイル済みアプリケーションとその実行時依存関係だけを含む、最小限のベースイメージです。
ビルドステージの中間イメージは破棄されるため、最終イメージは軽量になります。
マルチステージの例(Go)
GoアプリケーションのDockerfileを、マルチステージ方式で書き直してみましょう。最初のステージでアプリケーションをビルドし、コンパイル済みのバイナリだけを、はるかに小さい`alpine`ベースイメージにコピーします。
# Stage 1: Build the application
FROM golang:1.21-alpine AS builder
WORKDIR /app
COPY main.go .
RUN go build -o myapp main.go
# Stage 2: Create the final lightweight image
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/myapp .
EXPOSE 8080
CMD ["./myapp"]マルチステージビルドの実行
このDockerfileをビルドすると、Dockerは各ステージを実行します。ただし、最後の`FROM`命令の内容と、前のステージからコピーされたファイルだけが最終イメージを構成します。
Goコンパイラーとビルドツールは残されるため、シングルステージビルドと比べてイメージが大幅に小さくなります。
マルチステージビルドの利点
マルチステージビルドは、次の用途で非常に役立ちます。
- コンパイル型言語:Go、Java、C++、Rust。
- フロントエンドフレームワーク:ReactやAngularのアプリケーションをビルドし、Nginxで静的アセットを配信する場合。
- Node.jsアプリケーション:ビルドステージで`node_modules`をインストールし、`package.json`、`package-lock.json`、ビルド済みアプリケーションだけを軽量なランタイムイメージにコピーする場合。
理解度を確認
マルチステージDockerビルドを使用する主な利点は、次のうちどれでしょうか。
まとめ:マルチステージによる効率化
マルチステージDockerビルドについて学びました。
- 1つのDockerfile内で複数の
FROM命令を使用します。 ASキーワードでステージに名前を付け、COPY --from=でアーティファクトを転送します。- 主な利点は、最終イメージを大幅に小さくし、より安全で効率的にできることです。
この手法は、コンテナ化したアプリケーションを最適化するうえで重要です。次は、ビルドキャッシュの活用方法を見ていきます。
よくある質問
「効率化のためのマルチステージビルド」レッスンは無料ですか?
はい。「効率化のためのマルチステージビルド」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Docker & DevOps Fundamentalsコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Docker & DevOps Fundamentalsコースには全4レッスンが含まれています。
「効率化のためのマルチステージビルド」で何を学びますか?
ビルド時と実行時の依存関係を分離し、より小さく安全な本番イメージを作成するマルチステージビルドを活用します。 ブラウザで直接実行するハンズオンコードでDocker & DevOps Fundamentalsを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Docker & DevOps Fundamentalsを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのDocker & DevOps Fundamentalsは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「効率化のためのマルチステージビルド」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このDocker & DevOps Fundamentalsレッスンでコードを書いて実行できますか?
はい。すべてのDocker & DevOps Fundamentalsレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。