メモ:各アプリケーションコンテナのイメージ形式

ちょっと前のこの記事を思い出して、そういえばちょっとリンクだけでもメモっとこうと。

blog.gachapin-sensei.com

Docker

github.com

なんか意外と細かく決まってるなーという印象。Dockerのイメージは、

の束で成り立っていて、↓こういう構造らしい。

.
├── 5785b62b697b99a5af6cd5d0aabc804d5748abbb6d3d07da5d1d3795f2dcc83e
│   ├── VERSION
│   ├── json
│   └── layer.tar
├── a7b8b41220991bfc754d7ad445ad27b7f272ab8b4a2c175b9512b97471d02a8a
│   ├── VERSION
│   ├── json
│   └── layer.tar
├── a936027c5ca8bf8f517923169a233e391cbb38469a75de8383b5228dc2d26ceb
│   ├── VERSION
│   ├── json
│   └── layer.tar
├── f60c56784b832dd990022afc120b8136ab3da9528094752ae13fe63a2d28dc8c
│   ├── VERSION
│   ├── json
│   └── layer.tar
└── repositories

jsonにはメタデータが記述され、VERSIONにはそのスキーマバージョン。repositoriesにはタグとIDの対応が入るらしい。

layer.tarにはファイルシステムの差分が入っている。たとえば、以下のような変更があったとすると、

Added:      /etc/my-app.d/default.cfg
Modified:   /bin/my-app-tools
Deleted:    /etc/my-app-config

以下のようになる。削除されたファイルは.wh.で示す。ので、Dockerには.wh.で始まるファイルをつくることができないらしい。なんだその制約...

/etc/my-app.d/default.cfg
/bin/my-app-tools
/etc/.wh.my-app-config

App Container/rkt

github.com

シンプル。App Container Image (ACI)は以下の要素で構成される。

具体的には以下のようになっている。

/manifest
/rootfs
/rootfs/usr/bin/data-downloader
/rootfs/usr/bin/reduce-worker
...

Dockerと違うのは、ACIではイメージの署名とか暗号化についても定められているところ、かな?(Dockerはたぶんほかの仕様書に書いてあるんだろうけどめんどくさくて探してない)

LXD

(LXDはアプリケーションコンテナじゃない気もするけど)

github.com

LXDはACIよりちょっと複雑。

から成る。テンプレートとは、/etc/hostnameみたいな、イメージごとにちょっとづつ違うファイルを自動生成するためのテンプレート。

rootfs/
metadata.yaml
templates/

思ったこと

  • DockerのイメージIDはなんでイメージのハッシュ値じゃないんだろう(ACIとLXDはハッシュ値
  • LXDがテンプレートでやっていることは、DockerとかACIではどう解決してるんだろう