0Pricing
Docker & DevOps Fundamentals · レッスン

効率化のためのマルチステージビルド

ビルド時と実行時の依存関係を分離し、より小さく安全な本番イメージを作成するマルチステージビルドを活用します。

「効率化のためのマルチステージビルド」はCoddyKit上の無料Docker & DevOps Fundamentalsレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはDocker & DevOps Fundamentals学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Docker & DevOps Fundamentalsコースには全4レッスンが含まれています。

マルチステージビルドの概要

高度なDockerfile最適化へようこそ。今日は、より小さく効率的なDockerイメージを作成する強力な手法、マルチステージビルドについて学びます。

イメージを小さくすると、ダウンロードが速くなり、セキュリティが向上し、リソースをより有効に利用できます。

効率化のためのマルチステージビルド — イラスト1

イメージを小さくする重要性

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 効率化のためのマルチステージビルド
  2. ビルドキャッシュの活用
  3. Dockerfileのセキュリティベストプラクティス
  4. SlimとDistrolessベースによるイメージサイズの最小化
← Docker & DevOps Fundamentalsに戻る