Docker ストレージ ドライバ

理想的には、コンテナの書き込み可能なレイヤーへのデータが小さければ、データの書き込みには Docker ボリュームを使うでしょう。しかしながら、 作業量(workload) によってはコンテナの書き込み可能なレイヤーへの書き込みを必要とする場合があります。

交換可能(pluggable) なアーキテクチャを使う、複数のストレージ ドライバを、 Docker はサポートします。ストレージ ドライバが制御するのは、 Docker ホスト上でイメージとコンテナをどのようにして保管および管理するかです。 ストレージ ドライバ概要 を読んだ後であれば、次のステップは、自分の作業量にベストなストレージを選択します。ほとんど一般的なシナリオでは、全体的なパフォーマンスと安定性が最も高いストレージドライバを使用します。

Docker Engine は、ストレージ ドライバが明確に設定されていなければ、ストレージ ドライバが要件に合うよう、どれを使うのか優先順位を付けます。そして、互換性のあるストレージ ドライバを自動的に選びます。選ぶ順番は Docker Engine 20.10 のソースコード で見られます。

ストレージ ドライバによっては、 基盤ファイルシステム(backing filesystem) で特定のフォーマットの使用が必要になる場合があります。特定の支援ファイルシステムに外部要件があれば、選択は制限されるかもしれません。 サポートしている基盤ファイルシステム をご覧ください。

どのストレージ ドライバを使うのかを絞り込むのは、 作業負荷(workload) の特性と、必要とする安定性を決めた後です。

Linux ディストリビューション別のサポート済みドライバ

注釈

Docker Desktop と Rootless モードの Docker

Docker Desktop for Mac と Docker Desktop for Windows では、 ストレージ ドライバの変更をサポートしておらず、デフォルトのストレージ ドライバのみ利用できます。以下の表は、 Rootless モードにも適用されません。Rootless モードで利用可能なドライバについては、 Rootless モードのドキュメント をご覧ください。

オペレーティングシステムと kernel によっては、すべてのストレージ ドライバをサポートしていない可能性があります。たとえば、 aufs は Ubuntu と Debian のみサポートしています。また、 btrfs をストレージとして使う場合、システムが btrfs をサポートしていても、追加パッケージが必要になる場合があります。通常、最近の Linux ディストリビューションであれば以下の設定が動作します。

Linux ディストリビューション 推奨されるストレージ ドライバ 代替ドライバ
Ubuntu overlay2 overlay [1]devicemapper [2]aufs [3]zfsvfs
Debian overlay2 overlay [1]devicemapper [2]aufs [3]vfs
CentOS overlay2 overlay [1]devicemapper [2]zfsvfs
Fedora overlay2 overlay [1]devicemapper [2]zfsvfs
SLES 15 overlay2 overlay [1]devicemapper [2]vfs
RHEL overlay2 overlay [1]devicemapper [2]vfs
[1](1, 2, 3, 4, 5, 6) overlay ストレージ ドライバは非推奨であり、今後のリリースで削除されます。 overlay ストレージ ドライバの利用者は、 overlay2 への移行を推奨します。
[2](1, 2, 3, 4, 5, 6) devicemapper ストレージ ドライバは非推奨であり、今後のリリースで削除されます。 devicemapper ストレージ ドライバの利用者は、 overlay2 への移行を推奨します。
[3](1, 2) aufs ストレージ ドライバは非推奨であり、今後のリリースで削除されます。 aufs ストレージ ドライバの利用者は、 overlay2 への移行を推奨します。

未確定の場合、あらゆる用途でベストなのは、最近の Linux ディストリビューションと kernel がサポートしている overlay2 ストレージ ドライバを使う設定です。そして、書き込みが多い作業量の場合には、コンテナの書き込み可能なレイヤーに書き込みを依存するのではなく、 Docker ボリュームを使います。

vfs ストレージ ドライバは、通常はベストな選択ではありませんが、他のストレージ ドライバがサポートされていない状況で、主に調査目的として使えます。 vfs ストレージ ドライバを使う前に、 パフォーマンスとストレージの特徴および制限 をご覧ください。

上表での推奨項目は、多くの利用者に役立つと知られています。推奨する設定を使い、再現可能な問題を発見した場合は、素早い修正があるでしょう。この表で推奨されないドライバを使う場合は、自分自身でリスクを負って実行できます。実行にあたり、あらゆる問題は報告されるべきです。しかしながら、推奨される定を使った時に比べて、このような問題解決の優先度は低くなります。

Linux ディストリビューションに依存しますが、 btrfs のようなストレージ ドライバが利用可能な場合があります。これらのストレージドライバは、特定の用途で有利になりますが、通常の利用では推奨されていない追加セットアップやメンテナンスが必要となる場合があります。詳細は、各ストレージ ドライバのドキュメントをご覧ください。

サポートしている基盤ファイルシステム

Docker は 基盤ファイルシステム(backing filesystem) が、ファイルシステムの /var/lib/docker/ に位置していると想定しています。いくつかのストレージ ドライバは、特定の基盤ファイルシステムでのみ動作します。

ストレージ ドライバ サポートしている基盤ファイルシステム
overlay2overlay xfs で ftype=1 、 ext4
fuse-overlayfs あらゆるファイルシステム
aufs xfsext4
devicemapper direct-lvm
btrfs btrfs
zfs zfs
vfs あらゆるファイルシステム

他の検討事項

..-_suitability-for-your-workload: 処理内容に適しているかどうか ------------------------------

何より、それぞれのストレージドライバは自身の性能上の特徴があり、処理内容が変われば適している場合も、適さない場合もあります。以下のまとめを考えます。

  • overlay2aufsoverlay は、全ての処理をブロック単位ではなくファイル単位で行います。これはメモリを効率的に使いますが、書き込みがとても多い処理内容では、コンテナの書き込み可能なレイヤーが肥大化する可能性があります。
  • devicemapperbtrfszfs のようなブロック単位のストレージ ドライバは、書き込みが多い処理内容で、良いパフォーマンスです( Docker ボリュームと同じくらいではありませんが)。
  • たくさんの小さな書き込みや、多くのレイヤーがあるコンテナや、階層が深いファイルシステムでは、 overalayoverlay2 よりパフォーマンスが良いかもしれませんが、多くの inode を消費するため、 inode の肥大化を招く可能性があります。
  • btrfszfs は多くのメモリが必要です。
  • zfs は PaaS のような高密度の処理内容に対し、良い選択です。

パフォーマンス、安定性、ベストプラクティスに関する詳しい情報は、各ストレージ ドライバのドキュメントをご覧ください。

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

会社で SAN 、 NAS 、 ハードウェア RAID や他の共有ストレージ システムを使っている場合、それらが高可用性、パフォーマンス増加、シン プロビジョニング、冗長化、圧縮といった機能を提供しているかもしれません。多くの場合、これらのストレージ システム上でも Docker は動作します。しかし、 Docker はそれらと密接に統合されてはいません。

それぞれのストレージは、 Linux ファイルシステムやボリューム マネージャに基づいています。共有ファイルシステム上で、操作しようとしているストレージドライバの処理(ファイルシステムや ボリュームマネージャ)に関するベストプラクティスを確実に理解してください。たとえば、共有ファイルシステム上で ZFS ストレージドライバを使う場合、特定の共有ストレージシステム上で ZFS ファイルシステムを扱うベストプラクティスの理解が必要です。

安定性

利用者によっては、パフォーマンスよりも安定性の方が重要です。Docker では、ここで言及した全てのストレージ ドライバは安定していると考えており、他にも新しいものや活発な開発下にあるものも安定していると考えています。一般的に、 overlay2aufsdevicemapper は高い安定性のために選ばれます。

自分の処理内容をテスト

異なるストレージ ドライバ上で自身の処理内容を実行する時は、Docker のパフォーマンスをテストできます。同等のハードウェアと本番環境の状況に一致する処理内容で、どのストレージ ドライバが全体的なパフォーマンスがベストかを確認できます。

現在のストレージドライバを確認

個々のストレージドライバの詳細なドキュメントに、セットアップ手順や捨て緒レージドライバの使い方などの詳細があります。

Docker が現在どのストレージ ドライバを使っているか確認するには、 docker info を使い、 Storage Driver の行を探します。

$ docker info

Containers: 0
Images: 0
Storage Driver: overlay2
 Backing Filesystem: xfs
<...>

ストレージ ドライバを変更するには、新しいストレージ ドライバの個々の手順を確認します。ドライバによっては、Docker ホスト上の物理ディスクもしくは論理ディスクの設定を含む、追加の設定を必要とします。

重要

ストレージ ドライバを変更すると、あらゆる既存のイメージとコンテナにアクセスできなくなります。これは、それらのレイヤーが新しいストレージ ドライバでは使えないためです。変更を戻せば、再び以前のイメージとコンテナにアクセスできますが、新しいドライバで取得または作成したイメージやコンテナには、アクセスできなくなります。