2025/03/18 05:57 Build a Container Image from Scratch

やっほー、ロボ子!今日はコンテナイメージの内部構造をスクラッチから構築する話をするのじゃ!

博士、こんにちは!コンテナイメージの中身を自分で作るんですか?なんだか面白そうですね!

そうぞ!まずはOCIイメージの構成要素から説明するぞ。レイヤー、config、manifest、indexの4つがあるのじゃ。

レイヤーはファイルシステムの変更セットをまとめたもの、configはコンテナの実行方法を定義するもの、manifestはレイヤーとconfigを紐付けるもの、indexは複数のイメージをまとめるもの、という理解で良いですか?

その通り!特に重要なのはレイヤーじゃ。コンテナイメージの基本的な構成要素で、ファイルシステムの変更セットをtarアーカイブとしてシリアライズしたものなのじゃ。

変更セット、ですか?

そう!例えば、ファイルを追加したり、削除したり、変更したりすると、その差分がレイヤーとして保存されるのじゃ。削除されたファイルは`.wh`で示されるのが面白いところじゃな。

なるほど!そして、コンテナエンジンは複数のレイヤーを重ねて最終的なファイルシステムを生成するんですね。

その通り!そして、OCIイメージのコンポーネントは「Content Addressability」という方式で識別されるのじゃ。コンポーネントの識別子として暗号化ハッシュを使うことで、データの重複排除やレイヤー共有、データ整合性の確保に役立つらしいぞ。

ハッシュ値で識別するんですね。それで、イメージのレイアウトは`blobs/<alg>/<content addressable config/manifest/layer>`のようになっているんですね。

ふむ。例えば、Alpine Linuxをベースイメージとして使う場合、Alpineのルートファイルシステムを最初のレイヤーとして追加して、その上にhelloバイナリを含むレイヤーを重ねるのじゃ。

そして、`config.json`と`manifest.json`を更新して、新しいダイジェストでエンコードする必要があるんですね。

そういうことじゃ!実際に`layer.tar.gz`のSHA256ハッシュ値は36c412b23a871c4afbec29a45b25faad76197f3a9dbf806f3aef779af926790a、`config.json`は99c9d2dcbdbc6e28277d379c2b9a59443b91937720361773963d28d5376252a9、`manifest.json`は2e17c995558ebfa8faacfe64ff78c359ab9f28b3401076bb238fd28c5b3a648bになるのじゃ。

すごい、具体的な数値まで!

ちなみに、AlpineベースのhelloイメージのルートファイルシステムのSHA256ハッシュ値は8289bd1bdc2a1fae2d2d717b7c40baaedc4c5c4d9c9f4f1a1b045287067e9f2cらしいぞ。

博士、今日はコンテナイメージの内部構造について詳しく教えていただき、ありがとうございました!

どういたしまして!ところでロボ子、コンテナの中身を覗き見する時、一番緊張するのはどこだと思う?

え?どこでしょう…?

それは…コンテナID!…って、ベタすぎたかのじゃ?
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。