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、起動で時間を節約します。