Dockerイメージの中身を徹底解剖——tarで展開して分かるレイヤー構造の実体

元記事を読む
キュレーターコメント

「Dockerは使えるけど中身は謎」という人が多い中、実際にファイルを展開して見せてくれる実践的な備忘録。OverlayFSやmanifest.jsonの役割まで腹落ちさせてくれるので、コンテナ初中級者の理解深化にちょうどいい。

概要

「Dockerは使えるけど、イメージが実際に何者なのかよく分かっていない」——そんなモヤモヤを抱えたことはないだろうか。本記事では docker image save コマンドでイメージをtarに展開し、中のファイルを一つひとつ確認することで、Dockerイメージの実体を丁寧に解説している。

Dockerイメージは複数のレイヤーの積み重ねで構成されており、各レイヤーはそれぞれ独立したtarアーカイブとしてファイルシステムを持っている。これらを統合して一つのファイルシステムとして見せるのが LayerFS(OverlayFS) の仕組みだ。Dockerfileで定義したレイヤーは読み込み専用の LowerDir として積まれ、コンテナ起動後の変更は UpperDir に書き込まれる。コンテナが参照するのは両者をマージした MergedDir という仮想的なファイルシステムであり、これがDockerの「イミュータブルなイメージ+書き込み可能なコンテナ」という設計の核心にある。

展開後のディレクトリには blobs/sha256/manifest.jsonindex.jsonoci-layout が並ぶ。manifest.jsonConfig・RepoTags・Layers の3要素からなり、Dockerが起動時にどのレイヤーを重ねるかをここで解決する。一方 index.json はOCI標準フォーマット準拠で、podmanなど他のランタイムが参照する。日頃何気なく docker pull しているイメージが、実はこれほど構造的に整理されたアーカイブだと知ると、改めてDockerの設計の美しさを感じる。「なんとなく動いている」を「ちゃんと分かって使っている」に昇格させたいエンジニアに強くおすすめしたい一記事だ。