0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

コンテナイメージの中身を見てみたら、Linuxそのものだった

0
Posted at

はじめに

「コンテナイメージって、技術的にはどうなってるの?」と思ったことはないでしょうか。
上司に勧めていただいたLinuxの研修を受けてみたところ、これまで何となく使っていた「コンテナイメージ」の実体が見えてきました!
この記事では、実際にPodmanでFedoraイメージを取得・展開して、コンテナイメージの中に何が入っているのかを確認します。

コンテナとは

コンテナは、アプリケーションを実行するための実行環境をパッケージ化して配信する技術です。
コンテナについて理解するには、以下の4つを押さえる必要があります。

  • コンテナイメージ ←ここ
  • コンテナレジストリ
  • コンテナホスト
  • コンテナオーケストレーション
    今回は、この中のコンテナイメージに注目します。

image.png

コンテナイメージとは

コンテナイメージは、アプリケーションを実行するために必要な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 ファイル群の集合であることを確認できました。

  1. 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 pulldocker 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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?