ヒスねこTechBlog

日々の気になる技術をまとめてます。

Dockerイメージの観察

Dockerイメージの中身を簡単に見てみました。

イメージのビルド

調査用であまり複雑なイメージを使いたくなかったので、scratchからビルドすることにしました。

まず適当なファイル(hello.txt)を用意します。

Hello, world!

次にDockerfileを作成。

FROM scratch
ADD hello.txt /hello.txt

同ディレクトリ内で、イメージのビルドを行い、tarで保存します。

$ docker build -t testuser/testimage:v1 .
$ docker save -o testimage.tar testuser/testimage
イメージの観察

適当にディレクトリを掘って、そこにtarを展開してみます。

$ mkdir testimage && cd testimage
$ tar xvf ../testimage.tar
$ tree
.
├── d38166f2a4f5f18ce19da70292c3b6bd6f46d97ea73b8fd7937c28a19e94aa6c
│   ├── VERSION
│   ├── json
│   └── layer.tar
├── ea17a750c30e2a58a7697df587f1e033becfacc9d7ab628ec33fe331f5ff8b1d.json
├── manifest.json
└── repositories

このd38166~配下のlayer.tarを展開すると、そのレイヤに含まれるファイル、つまりhello.txtが取得できます。

レイヤをもう一層重ねる

もう一層重ねてみます。別のディレクトリを作成し、適当なファイル(hoge.txt)を置きます。

hogehoge

Dockerfileを次のように記載します。

FROM testuser/testimage:v1
ADD hoge.txt /hoge.txt

これで先ほど作成したイメージにさらにレイヤを重ねた、新たなイメージが作成されます。

$ docker build -t testuser/testimage:v2 .
$ docker save -o testimage2.tar testuser/testimage:v2
$ mkdir testimage2 && cd testimage2
$ tar xvf ../testimage2.tar
$ tree
.
├── a1ac6e668a69447918ad829196eba5a04490122120eb813b4c4fca3ba4222a9c
│   ├── VERSION
│   ├── json
│   └── layer.tar
├── b371b2502f66dfe68ddd56aa8e8411f529760fecab4222231f9c2db21159ed8b.json
├── fb378a43fa513bafd90ff70cd93564065eb0c2c93da99faea70e1a3e3883b755
│   ├── VERSION
│   ├── json
│   └── layer.tar
├── manifest.json
└── repositories

一層目で作成したhello.txtが入っているのは、fb378a~の方です。配下のlayer.tarを展開するか、jsonを見てみるとそのことがわかります。

同じレイヤであればディレクトリ名も変わらないだろうと予想していたのですが、変化していますね。ディレクトリごとdiffを取ると、jsonの中身が変化している様子。これがハッシュ値の違いに影響していそうですが、公式の情報をあたってみるべきかなぁ。

manifest.jsonのLayersを見てみると、下のレイヤから順番に並んでいそう。

[{"Config":"b371b2502f66dfe68ddd56aa8e8411f529760fecab4222231f9c2db21159ed8b.json","RepoTags":["testuser/testimage:v2"],"Layers":["fb378a43fa513bafd90ff70cd93564065eb0c2c93da99faea70e1a3e3883b755/layer.tar","a1ac6e668a69447918ad829196eba5a04490122120eb813b4c4fca3ba4222a9c/layer.tar"]}]

次回はOverlayFSでマウントしてみます。

techblog.hys-neko-lab.com