Skip to content
Latchkey

Docker image とは何か? レイヤー、タグ、ダイジェストの解説

Docker image は、ファイルシステムのレイヤー化された読み取り専用のスナップショットにメタデータを加えたもの - すべてのコンテナが起動する元となるテンプレートです。

何かを docker run するとき、あなたは image からコンテナを起動しています。image は一度 build されると決して変わりません。コンテンツアドレス方式で、積み重なったレイヤーから成ります。その構造を理解すると、なぜ build の cache がこれほどうまく効くのか、そしてなぜ CI で image のサイズが重要なのかが分かります。

image はレイヤーから成る

ファイルシステムを変更する Dockerfile の各命令はレイヤーを生成します。レイヤーは互いに積み重なり、image 間で共有されます。2 つの image がどちらも FROM ubuntu:22.04 で始まる場合、それらはそのベースレイヤーをディスク上でもネットワーク越しでも共有します。

不変でコンテンツアドレス方式

image とその各レイヤーは、その内容の SHA-256 ダイジェストによって識別されます。1 バイトでも変えればダイジェストが変わります。これが pull をキャッシュ可能にし、build を再現可能にするものです - 同一の入力は同一のレイヤーを生成します。

タグ vs ダイジェスト

myapp:1.4 のようなタグは、人間にとって扱いやすい移動可能なポインターです。sha256:abc... のようなダイジェストは正確なコンテンツを指し示し、決して移動しません。CI では、ダイジェストで固定することで、テストしたのとまったく同じビットを deploy することが保証されます。

image のメタデータ

  • 実行するデフォルトのコマンドと entrypoint。
  • 環境変数と公開されるポート。
  • 作業ディレクトリとデフォルトユーザー。
  • image が対象とするアーキテクチャと OS。

なぜ CI でサイズが重要なのか

小さい image は pull が速く、push が速く、起動も速くなります - 節約された 1 メガバイトごとが、すべての job にわたって掛け算されます。image のスリム化(multi-stage build、最小限のベース)は、最もレバレッジの高い CI 最適化の 1 つです。

重要なポイント

  • image は、不変でレイヤー化され、コンテンツアドレス方式のコンテナ用テンプレートです。
  • タグは移動可能なラベルであり、ダイジェストは正確なコンテンツを固定します。
  • 小さい image は、CI におけるすべての pull、push、起動で時間を節約します。

関連ガイド