RedHatのシニアソフトウェアエンジニアであるVincent Batts氏が,FOSDEMの仮想化関連の開発者セミナでLinuxコンテナとDockerについて講演して,さまざまなストレージドライバの長所と短所,イメージフォーマット,イメージへの署名などについて語った。
Linuxカーネルの機能を応用したコンテナは,古くから存在している技術をベースとする。
- リソース管理グループ(cgroup) – メモリやCPU,ディスクI/Oなどのリソースを分類し,使用率の制限を設定する。
- ネームスペース・アイソレーション – プロセスをグループ化して分離し,グループを越えたリソース参照やアクセスを禁止する。
一時的コンテナ(ephemeral container)というコンセプトを一般に認知させたのがDockerだ。Dockerのコンテナは,クリーンな状態でローンチされた後,所定の状態に到達する。inspect,restart,commitといったコマンドによって,以前のスナップショットを管理することが可能だ。
Dockerの基盤となるストレージドライバは変更が可能で,さまざまな機能やパフォーマンス,安定性のものがある。
- vfs: スリルもマジックもないストレージドライバ。Docker内でDockerを実行できる,数少ないドライバのひとつでもある。
- aufs: 高速だがメモリを大量に消費する,非アップストリームドライバ。ubuntuカーネル独自のもの。システムにaufsユーティリティがインストールされていれば,Dockerはそれを利用する。start/stopコンテナイベントの数が多い場合には,メモリを大量に消費する。また,いくつかの限界値において,デバッグが困難と思われる問題が存在する。
- devicemapper: 一般的にサポートされているデフォルトドライバ。多くのコントリビューションによって改良が加えられている。シン・プロビジョニング(thin provisioning)と"コピー・オン・ライト"スナップショットを使用する。最も低速なドライバだが,チューニングによって実運用時のパフォーマンスを向上することが可能だ。メタデータとデータ用に2つのブロックデバイスを必要とする。また,高速なI/Oが必要な場合には適さない。
- brfs: 高速に動作する実験的ドライバ。まだバグが残っているため,データ破損の発生する可能性がある。
- overlayFS: ユニオンファイルシステムを利用した新しいドライバ。アップストリームを含み,極めて高速に動作する。最終的に3.18.0カーネルにマージされた後は,カーネルに密接に組み込まれた構造になっている。
ストレージドライバの選択に関して,氏は,次のようにアドバイスする。
明確な勝者はありません。 デフォルトはどれも一般的なものなので,あなたのユースケースに最も適したものを学んでください。
コンテナレイヤはLXCにはなく,Dockerで導入された新しい概念だ。コンテナは不変(immutable)で読み取り専用であり,読み書きのスナップショットはその上に配置される。主な違いはパフォーマンスに関する部分である。ストレージドライバではレイヤ間の違いを演算する必要があり,その部分が各ドライバに特有だからだ。btrfsが高速なのは,その差異計算をネイティブに行っていることによる。
Dockerのポータブルイメージフォーマットは,データ転送で一般的に使用されているtarアーカイブで構成される。
commit
を使用して,イメージをコンテナにコミットする。- docker
push
とsave
を実行する。 - docker
build
を使用して,既存イメージにコンテキストを追加する。
イメージを作る場合には,Dockerが各レイヤの差分を取得して,その差分によるtarアーカイブを生成する。pullする時は,ファイルシステム内でそのtarを展開する。pullとpushをもう一度行うと,そのtarボールが更新される。プロセスやパーミッション,ファイル属性,あるいはタイムスタンプが変更されている可能性があるためだ。
イメージへの署名は非常に困難である。イメージは読み取り専用でマウントされているが,イメージレイヤは毎回組み換えられているためだ。外部からdocker save
でtarボールを生成して,pgp
でアーカイブに署名することは可能である。