Dockerイメージのフォーマット

  • 問: Dockerイメージはどういうフォーマットなのか
  • 答: 特定のフォーマットはないが転送時はtar

以前の記事 では、Dockerはアプリケーション動作環境のファイルステムをまとめて差分転送できると書いた。 ではこのディスクイメージはどういうフォーマットなのだろう。

実装こそ違うが実態としては仮想マシン環境に似ているという点を鑑みると、qcowとか何かその類いのファイルフォーマットなのかもしれないという想像も成り立つ。 しかし実際には特定のフォーマットというものはない。

Dockerホスト環境では、ディスクイメージは動作に適した形で保存されている。このため保存形式はdocker daemon-storage-driver オプションによって異なる。 つまり --storage-driver=aufs で走っているならローカルファイルシステムのサブディレクトリ内に展開されているし、 --storage-driver=devicemapper ならblock deviceとして格納されている。 このためdockerコンテナを走らせるときにはただaufsなり何なりをmountするだけで即座にコンテナのファイルシステムを用意できる。イメージを展開したりそのコンテナ用に複製したりする作業は不要なわけだ。

一方、イメージを転送する際には格納方法がまちまちでは困る。そこで転送時は単にファイルシステム内のエントリを(正確に言うと親イメージからの差分を)tarで固めて転送する。 なおdockerイメージには親イメージのIDやコンテナ実行時のデフォルトのコマンドラインなどメタデータも含まれるので、これは別途JSON形式で転送する。 詳しいことは Docker Registry API reference に書いてある。