メインコンテンツまでスキップ

ボリューム

ボリュームは Docker コンテナによって生成され使用されるデータを永続化するための推奨されるメカニズムです。バインドマウントはホストマシンのディレクトリ構造と OS に依存していますが、ボリュームは Docker によって完全に管理されます。ボリュームはバインドマウントに比べていくつかの利点があります:

  • ボリュームはバインドマウントよりもバックアップや移行がしやすい。
  • Docker CLI コマンドまたは Docker API を使用してボリュームを管理できます。
  • ボリュームは Linux と Windows の両方のコンテナで動作します。
  • ボリュームは複数のコンテナ間でより安全に共有できます。
  • ボリュームドライバーを使用すると、ボリュームをリモートホストやクラウドプロバイダーに保存したり、ボリュームの内容を暗号化したり、他の機能を追加したりできます。
  • 新しいボリュームは、コンテナによって内容が事前に準備されることがあります。
  • Docker Desktop 上のボリュームは、Mac と Windows ホストからのバインドマウントよりもはるかに高いパフォーマンスを持っています。

さらに、ボリュームは、コンテナの書き込み可能なレイヤーにデータを永続化するよりも良い選択肢であることが多いです。なぜなら、ボリュームはそれを使用するコンテナのサイズを増加させず、ボリュームの内容は特定のコンテナのライフサイクルの外に存在するからです。

注記:データボリュームの使用は、Linux 上でディレクトリやファイルをマウントすることに似ています。イメージで指定されたマウントポイントのディレクトリ内のファイルはデータボリュームにコピーされます(データボリュームが空の場合のみ)。

データボリュームの作成

$ docker volume create my-vol

すべての データボリューム を表示

$ docker volume ls

DRIVER VOLUME NAME
local my-vol

ホスト上で次のコマンドを使用して、特定の データボリューム に関する情報を表示

$ docker volume inspect my-vol
[
{
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
"Name": "my-vol",
"Options": {},
"Scope": "local"
}
]

マウントされたデータボリュームを持つコンテナの起動

docker run コマンドを使用するときに、--mount フラグを使用してデータボリュームをコンテナにマウントします。複数のデータボリュームを単一の docker run でマウントできます。

コンテナ web を作成し、/usr/share/nginx/html ディレクトリにデータボリュームを読み込みます。

$ docker run -d -P \
--name web \
# -v my-vol:/usr/share/nginx/html \
--mount source=my-vol,target=/usr/share/nginx/html \
nginx:alpine

ボリュームに関する特定の情報の表示

ホスト上で次のコマンドを使用して、web コンテナに関する情報を表示

$ docker inspect web

データボリュームの情報は "Mounts" キーの下にあります

"Mounts": [
{
"Type": "volume",
"Name": "my-vol",
"Source": "/var/lib/docker/volumes/my-vol/_data",
"Destination": "/usr/share/nginx/html",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],

ボリュームの削除

$ docker volume rm my-vol

ボリュームはコンテナのライフサイクルに関係なくデータを永続させるように設計されています。Docker はコンテナを削除するときに自動的にデータボリュームを削除しませんし、もはやどのコンテナからも参照されていないデータボリュームのガベージコレクションのメカニズムも持っていません。コンテナと一緒にボリュームを削除したい場合は、コンテナを削除する際に docker rm -v コマンドを使用します。

使用されていないすべてのボリュームを削除してスペースを解放するには:

$ docker volume prune

ボリュームに適したユースケース

ボリュームは Docker コンテナとサービスでデータを永続化するための推奨される方法です。 ボリュームに適したユースケースには以下が含まれます:

  • 複数の実行中のコンテナ間でデータを共有する。明示的に作成しない場合、ボリュームはコンテナに初めてマウントされたときに作成されます。そのコンテナが停止または削除されても、ボリュームは存在し続けます。複数のコンテナが同時に同じボリュームをマウントできます。読み書き可能または読み取り専用のいずれかです。ボリュームは明示的に削除したときにのみ削除されます。

  • Docker ホストに特定のディレクトリまたはファイル構造が保証されていない場合。ボリュームは、Docker ホストの設定をコンテナランタイムから切り離すのに役立ちます。

  • ローカルではなく、リモートホストやクラウドプロバイダーにコンテナのデータを保存したい場合。

  • 一つの Docker ホストから別の Docker ホストにデータをバックアップ、復元、または移行する必要がある場合、ボリュームがより良い選択です。ボリュームを使用しているコンテナを停止し、ボリュームディレクトリをバックアップできます (例:/var/lib/docker/volumes/<volume-name>)。

  • Docker Desktop 上でアプリケーションが高性能な I/O を必要とする場合。ボリュームはホストではなく Linux VM に保存されるため、読み取りと書き込みの遅延が大幅に低減され、スループットが向上します。

  • アプリケーションが Docker Desktop 上で完全にネイティブなファイルシステムの振る舞いを必要とする場合。例えば、データベースエンジンはトランザクションの耐久性を保証するためにディスクフラッシュを正確に制御する必要があります。ボリュームは Linux VM に保存され、これらの保証を提供できますが、バインドマウントは macOS や Windows にリモートされ、ファイルシステムの振る舞いがわずかに異なります。

参考文献

ボリュームに適したユースケース