ストレージ・ドライバの選択

このページは Docker のストレージ・ドライバ機能を説明します。Docker がサポートしているストレージ・ドライバの一覧と、ドライバ管理に関連する基本的なコマンドを扱います。ページの最後では、ストレージ・ドライバの選び方のガイドを提供します。

なお、このページは、既に ストレージ・ドライバ技術を理解 している読者を想定しています。

交換可能なストレージ・ドライバ構造

Docker は接続可能な(pluggable)ストレージ・ドライバ構造を持っています。そのため、自分の環境や使い方に応じて、ベストなストレージ・ドライバを「プラグイン」(接続)として選べます。これが柔軟さをもたらします。Docker の各ストレージ・ドライバは、 Linux ファイルシステムやボリューム・マネージャの技術に基づいています。そのうえ、各ストレージ・ドライバはイメージ・レイヤとコンテナ・レイヤの管理を、各々の独自手法により自由に管理方法を実装できます。つまり、同じストレージ・ドライバであっても、異なった状況では性能が良くなるのを意味します。

どのドライバがベストかを決めたら、Docker デーモンの起動時にドライバを指定するだけです。Docker デーモンは対象のストレージ・ドライバを使って起動します。そして、デーモン・インスタンスによって作成される全てのコンテナは、全てその同じストレージ・ドライバを使っています。次の表はサポートされているストレージ・ドライバ技術とドライバ名です。

技術 ストレージ・ドライバ名
OverlayFS overlay または overlay2
AUFS aufs
Btrfs btrfs
Device Mapper devicemapper
VFS* vfs
ZFS zfs

デーモンで何のストレージ・ドライバが設定されているかを確認するには、 docker info コマンドを使います。

$ docker info
Containers: 0
Images: 0
Storage Driver: overlay
 Backing Filesystem: extfs
Execution Driver: native-0.2
Logging Driver: json-file
Kernel Version: 3.19.0-15-generic
Operating System: Ubuntu 15.04
... 以下の出力は省略...

info サブコマンドで分かるのは、Docker デーモンが overlay ストレージ・ドライバを使い、Backing Filesystemextfs の値にしています。 extfs の値は、 overlay ストレージ・ドライバを、既存の(ext)ファイルシステム上で行うという意味があります。

自分がどのストレージ・ドライバを使うか選ぶにあたり、Docker ホストのローカル・ストレージ領域で使おうとするファイルシステムに一部依存します。いくつかのストレージ・ドライバは、異なったファイルシステム技術の上でも操作できます。しかしながら、特定のストレージ・ドライバは特定のファイルシステム技術を必要とします。例えば、 btrfs ストレージ・ドライバを使うには btrfs ファイルシステム技術を使う必要があります。以下の表は、各ストレージ・ドライバが、それぞれホスト上の何のファイルシステム技術をサポートしているかの一覧です。

ストレージ・ドライバ 一般的に使うファイルシステム 無効なファイルシステム
overlay ext4 xfs btrfs aufs overlay overlay2 zfs eCryptsfs
overlay2 ext4 xfs btrfs aufs overlay overlay2 zfs eCryptsfs
aufs ext4 xfs btrfs aufs eCryptsfs
btrfs btrfs のみ N/A
devicemapper direct-lvm N/A
vfs デバッグ用途のみ N/A
zfs zfs のみ N/A

注釈

「無効な」という意味は、対象のストレージ・ドライバが特定のファイルシステム上で実行できないのを意味します。

ストレージ・ドライバを設定するには dockerd コマンドで --storage-driver=<名前> オプションを使うか、あるいは、 /etc/default/docker ファイル中の DOCKER_OPTS 行を編集します。

以下のコマンドは Docker デーモンの起動時、 dockerd コマンドで devicemapper ストレージ・ドライバを指定しています。

$ dockerd --storage-driver=devicemapper &

$ docker info
Containers: 0
Images: 0
Storage Driver: devicemapper
 Pool Name: docker-252:0-147544-pool
 Pool Blocksize: 65.54 kB
 Backing Filesystem: extfs
 Data file: /dev/loop0
 Metadata file: /dev/loop1
 Data Space Used: 1.821 GB
 Data Space Total: 107.4 GB
 Data Space Available: 3.174 GB
 Metadata Space Used: 1.479 MB
 Metadata Space Total: 2.147 GB
 Metadata Space Available: 2.146 GB
 Thin Pool Minimum Free Space: 10.74 GB
 Udev Sync Supported: true
 Deferred Removal Enabled: false
 Data loop file: /var/lib/docker/devicemapper/devicemapper/data
 Metadata loop file: /var/lib/docker/devicemapper/devicemapper/metadata
 Library Version: 1.02.90 (2014-09-01)
Execution Driver: native-0.2
Logging Driver: json-file
Kernel Version: 3.19.0-15-generic
Operating System: Ubuntu 15.04
<出力を省略>

ストレージ・ドライバの選択は、コンテナ化されたアプリケーションの性能に影響を与えます。そのために大切になるのは、どのようなストレージ・ドライバのオプションが利用可能かを理解し、アプリケーションに対する正しい選択をすることです。このページの後半では、適切なドライバを選ぶためのアドバイスを扱います。

共有ストレージ・システムとストレージ・ドライバ

多くの商用システムでは、SAN や NAS アレイのような共有ストレージ・システムをストレージ容量に使います。性能や安定性を向上させるためだけでなく、プロビジョニング・冗長化・圧縮など、高度な機能を提供します。

Docker ストレージ・ドライバとデータ・ボリュームは、共有ストレージ・システムが提供するストレージ上でも操作可能です。そのため、これらの提供されるシステムによって、Docker の性能と可用性を増大できます。しかしながら、 Docker はこれら基盤システムとは統合できません。

各ストレージ・ドライバは Linux ファイルシステムやボリューム・マネージャを基盤としているのを覚えておいてください。自分の共有ストレージ・システム上で、ストレージ・ドライバ(ファイルシステムやボリューム)を操作するベスト・プラクティスを理解してください。例えば、ZFS ストレージ・ドライバを XYZ 共有ストレージ・システム上で使うのであれば、XYZ 共有ストレージ・システム上の ZFS ファイルシステムの操作のベストプラクティスを理解すべきです。

望ましいストレージ・ドライバの選択

ストレージ・ドライバの選択には、複数の要素が影響を与えます。しかしながら、2つの事実を覚え続けなくてはけません。

  1. 全てのユースケースに適用できるドライバは存在しない
  2. ストレージ・ドライバは常に改良・進化し続けている

これらの要素を頭に入れつつ、以下で扱うポイントと表が、検討にあたっての材料になるでしょう。

安定性

Docker の利用にあたり、最も安定かつ手間がかからないという面では、以下の点が考えられます。

  • ディストリビューションの標準ストレージ・ドライバを使います 。Docker をインストールする時、システム上の設定に応じてデフォルトのストレージ・ドライバを選択します。デフォルトのストレージ・ドライバの使用は、安定性に対する重要な要素になります。デフォルトのものを使わなければ、バグや微妙な差違に遭遇する可能性が増えるかもしれません。
  • CS Engine 互換表の詳細内容をご確認ください互換表 )。CS Engine とは商用サポート版の Docker Engine です。コード基盤はオープンソース版の Docker Engine と同じですが、ある範囲における設定をサポートしてます。これら サポートしている設定の範囲 では、最も安定かつ成熟したストレージ・ドライバを使います。これらの設定から外れれば、バグや微妙な差違に遭遇する可能性が増えるかもしれません。

経験と専門知識

ストレージ・ドライバの選択には、あなたと皆さんのチーム・組織で使ったことがあるものを選びます。例えば、RHEL や派生ディストリビューションを使っている場合は、既に LVM と Device Mapper の使用経験があるでしょう。その場合は、 devicemapper ドライバの使用が望ましいでしょう。

Docker がサポートしているストレージ・ドライバの利用経験がないのであれば、どうしたら良いでしょうか。簡単に使える安定した Docker を使いたいのであれば、ディストリビューションが提供する Docker パッケージを使い、そこで使われているデフォルトのドライバの使用を検討すべきでしょう。

将来性の考慮

多くの方が OverlayFS こそが Docker ストレージ・ドライバの未来だと考えています。ですが、まだ成熟しておらず、安定性に関しては aufsdevicemapper のような成熟したドライバより劣るかもしれません。そのため、OverlayFS を注意して使用すべきであり、成熟したドライバを使うよりも多くのバグや差違に遭遇することが予想されます。

以下の図はストレージ・ドライバの一覧にしたものです。それぞれの良い点・悪い点に関する洞察をもたらすでしょう。

ストレージドライバの比較

OverlayFS は2つのストレージ・ドライバがあります。どちらも同じ OverlayFS 技術を使っていますが、実装が異なり、ディスク・ストレージ上の互換性がありません。ストレージに互換性がないため、両者を切り替えるためには、全てのイメージ内容の再構築が必要です。 overlay ドライバはオリジナルの実装であり、Docker 1.11 より以前のバージョンでのみ指定可能です。 overlay ドライバにはiノード増大とパフォーマンス維持に対する限界が分かっています。 overlay2 ドライバはこの限界に対応するものですが、Linux カーネル 4.0 以降にのみ互換性があります。カーネル 4.0 よりも低いバージョンのユーザや、現在 overlay グラフを使っているのであれば、そのまま overlay の利用を推奨します。カーネル 4.0 以上のユーザや、既存の overlay グラフ・データが無いまたは不要であれば overlay2 を使うのが良いかもしれません。

注釈

overlay2 グラフ・データは overlay グラフ・データに干渉しません。しかしながら overlay2 に切り替える時は、ストレージの重複を避けるため overlay グラフ・データの削除が必要です。