はじめに
「コンテナイメージって、技術的にはどうなってるの?」と思ったことはないでしょうか。
上司に勧めていただいたLinuxの研修を受けてみたところ、これまで何となく使っていた「コンテナイメージ」の実体が見えてきました!
この記事では、実際にPodmanでFedoraイメージを取得・展開して、コンテナイメージの中に何が入っているのかを確認します。
コンテナとは
コンテナは、アプリケーションを実行するための実行環境をパッケージ化して配信する技術です。
コンテナについて理解するには、以下の4つを押さえる必要があります。
- コンテナイメージ ←ここ
- コンテナレジストリ
- コンテナホスト
- コンテナオーケストレーション
今回は、この中のコンテナイメージに注目します。
コンテナイメージとは
コンテナイメージは、アプリケーションを実行するために必要なOSライブラリやプログラムをまとめた配布パッケージです。
「コンテナ専用の謎のバイナリファイル」のようなものを想像していましたが、実際の構造を見てみると、Linuxのファイル群を格納したtarベースのLayerと、JSON形式のメタデータから構成されています。
概念的には次のようになっています。
コンテナイメージ
│
├── Manifest(目次)
│ ├── どの設定ファイルを使う?
│ └── どのLayerを何枚使う?
│
├── Config(設定書)
│ ├── 起動時に何を実行する?
│ ├── 環境変数は?
│ ├── CPUアーキテクチャは?
│ └── その他のコンテナ設定
│
└── Layer(Linux本体)
├── Layer1
├── Layer2
└── Layer3
↓
Linuxファイルシステム
├── /bin
├── /etc
├── /usr
├── /var
└── /app
つまり、
コンテナイメージ=Linuxファイル群+設定情報(JSON) です。
実際にコンテナイメージを見てみよう(全体像)
今回は Fedora イメージを例に確認します。
podman pull fedora
podman save -o fedora.tar fedora
ls -lh fedora.tar
tar -tf fedora.tar | head -30
1. podman pull fedora
コンテナレジストリからFedoraイメージを取得します。
実行結果:
# quay.ioレジストリからFedoraのイメージを取得
MacBook-Air ~ % podman pull fedora
Trying to pull quay.io/fedora/fedora:latest...
Getting image source signatures
# blob(Layor本体)
Copying blob sha256:de0a669c264114622e04f7eb3ac3d2cab7a03fd0f10b6d6e41b57c5a4fcfb8c2
# config(コンテナ設定(json))
Copying config sha256:9589ced5894a570e4dbc5a39a77e83c57b5a9279901665194ec567b7e3b5da56
# manifest to image
Writing manifest to image destination
9589ced5894a570e4dbc5a39a77e83c57b5a9279901665194ec567b7e3b5da56
Manifestを取得し、必要なBlob, Configをコピー、最後に取得済みのManifestをローカルストレージへ保存します。
2. podman save -o fedora.tar fedora
Podman内部に保存されているコンテナイメージを、1つのtarファイルとして取り出します。
1.でpodman pull fedoraを実行した時点で、
Podman内部ストレージ
Fedora Image
├─ Manifest
├─ Config
└─ Layer
となっていますが、この状態ではPodmanが管理しているため中身が見えないので、fedora.tarファイルにFedoraコンテナイメージを書き出します。
3. ls -lh fedora.tar
-rw-r--r-- 1 hinano staff 190M 8 11 18:33 fedora.tar
fedora.tarが保存されていることを確認。
4. tar -tf fedora.tar | head -30
実行結果:
6b71c9f546c30fedfefe2c3e3e6c2803579bccf7ab5a16ad9bf5b9636a521ae2.tar
9589ced5894a570e4dbc5a39a77e83c57b5a9279901665194ec567b7e3b5da56.json
3b4843d6a1fb0aefe8d163286805de0f700b33a987ddb21722fbc4977c8f3424/layer.tar
3b4843d6a1fb0aefe8d163286805de0f700b33a987ddb21722fbc4977c8f3424/VERSION
3b4843d6a1fb0aefe8d163286805de0f700b33a987ddb21722fbc4977c8f3424/json
manifest.json
repositories
ようやく、fedoraイメージが見れました!全体像を把握します。
fedora-image/
│
├── manifest.json(目次)
├── 9589ce....json(設定書)
├── 6b71c9....tar(Layer本体)
├── repositories(目次補助)
└── 3b4843d6....(Docker Archive形式で利用されるイメージID用の管理ディレクトリ? ここむずい)
├── layer.tar
├── json
└── VERSION
実際にコンテナイメージを見てみよう(各ファイル)
ここからは、コンテナイメージを構成する各ファイルの中身を確認します。
fedora-image/
│
├── manifest.json(目次)
├── 9589ce....json(設定書)
├── 6b71c9....tar(Layer本体)
├── repositories(目次補助)
└── 3b4843d6....(今回はスキップ)
1. manifest.json(目次)
まずはコンテナイメージ全体の目次である manifest.json を確認します。
cat manifest.json | jq . # jq.を使って整形して表示
実行結果:
[
{
"Config": "9589ced5894a570e4dbc5a39a77e83c57b5a9279901665194ec567b7e3b5da56.json",
"RepoTags": [
"quay.io/fedora/fedora:latest"
],
"Layers": [
"6b71c9f546c30fedfefe2c3e3e6c2803579bccf7ab5a16ad9bf5b9636a521ae2.tar"
]
}
]
イメージ名とタグ、イメージを構成するLayerファイル、設定情報を保持するJSONファイルが格納されています。
同様に他のファイルも見ていきます。
2. 9589ce....json(設定書)
{
// このイメージが作成された日時
"created": "2026-08-11T06:48:21.294603933Z",
// イメージの作成者
"author": "Fedora Project Contributors",
// 対象CPUアーキテクチャ
// 今回はApple Silicon(M1/M2/M3)で取得したためarm64
"architecture": "arm64",
// 対象OS
"os": "linux",
// ARM CPUのバージョン
"variant": "v8",
// コンテナ起動時の設定
"config": {
// コンテナ起動時に設定される環境変数
"Env": [
"PATH=/usr/local/bin:/usr/bin",
"container=oci"
],
// コンテナ起動時のデフォルト実行コマンド
"Cmd": [
"/bin/bash"
],
// 作業ディレクトリ
"WorkingDir": "/",
// イメージに関するメタ情報
"Labels": {
"io.buildah.version": "1.43.2",
"org.opencontainers.image.licenses": "MIT",
"org.opencontainers.image.title": "fedora",
"org.opencontainers.image.url": "https://fedoraproject.org/",
"org.opencontainers.image.vendor": "Fedora Project",
"org.opencontainers.image.version": "44"
}
},
// 利用するLayer情報
"rootfs": {
// root filesystemはLayerで構成される
"type": "layers",
// 利用するLayerのハッシュ値
// manifest.jsonに記載されていたlayer.tarと対応している
"diff_ids": [
"sha256:6b71c9f546c30fedfefe2c3e3e6c2803579bccf7ab5a16ad9bf5b9636a521ae2"
]
},
// イメージの作成履歴
"history": [
{
"created": "2026-08-11T06:48:22.182433352Z",
// イメージ作成ツール
"created_by": "KIWI 10.3.0",
"author": "Fedora Project Contributors"
}
]
}
3. 6b71c9....tar(Layer本体)
tarファイルはそのままcatコマンドで見れないので、中身をfedora-imageディレクトリの中に取り出します。
mkdir fedora-image
tar -xf fedora.tar -C fedora-image # fedora.tarを展開(extract)して、fedora-imageディレクトリの中に取り出す。
cd fedora-image
# layer.tarファイルの中身を見ます。
tar -tf 6b71c9f546c30fedfefe2c3e3e6c2803579bccf7ab5a16ad9bf5b9636a521ae2.tar | head -50
実行結果:
MacBook-Air fedora-image % tar -tf 6b71c9f546c30fedfefe2c3e3e6c2803579bccf7ab5a16ad9bf5b9636a521ae2.tar | head -50
.profile
afs/
bin
boot/
dev/
etc/
etc/.pwd.lock
etc/.updated
etc/DIR_COLORS
etc/DIR_COLORS.lightbgcolor
etc/GREP_COLORS
etc/X11/
etc/X11/applnk/
etc/X11/fontpath.d/
etc/X11/xinit/
etc/X11/xinit/xinitrc.d/
etc/X11/xinit/xinput.d/
etc/aliases
etc/alternatives/
etc/alternatives/libnssckbi.so
etc/authselect/
layer.tarファイルの中身を見てみると、Linuxで見慣れた/bin, /etc, /devなどのディレクトリが格納されています。
Layerの実態は、Linuxのファイルシステムそのもの。
コンテナイメージの実体が Linux ファイル群の集合であることを確認できました。
- repositories
cat repositories | jq .を実行。
実行結果:
{
"quay.io/fedora/fedora": {
"latest": "3b4843d6a1fb0aefe8d163286805de0f700b33a987ddb21722fbc4977c8f3424"
}
}
repositories はイメージ名と内部IDの対応表です。
今回は quay.io/fedora/fedora:latest が3b4843d6a1fb0aefe8d163286805de0f700b33a987ddb21722fbc4977c8f3424という内部IDで管理されていることが分かります。
おわりに
今回 Fedora イメージを実際に展開して確認した結果、コンテナイメージは以下の3つの要素で構成されていることが分かりました。
- Manifest(目次)
- Config(設定書)
- Layer(Linuxファイルシステム)
普段は podman pull や docker pull を実行するだけですが、その裏では Linuxファイルシステムを格納したLayer(.tar)と、それを利用するための設定情報(json)が管理されています。
これまで「コンテナイメージは何となく使うもの」という理解でしたが、実際に中身を見てみることで、その実体が何か覗くことができました
参考
https://developers.redhat.com/learning/learn:openshift:container-internals/resource/resources:containers-101
https://tech-blog.rakus.co.jp/entry/20231003/docker
