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でマウントしてみます。