-vフラグによるDocker Volumeマウント

Docker名前付きvolumeを使用してcontainerデータを永続化する方法を学びます。volumeのライフサイクル、container間でのデータ共有、本番データにbind mountよりもvolumeが推奨される理由について解説します。

Volumes & Storage

詳細な説明

Docker Volumeによるデータの永続化

containerのファイルシステムは一時的です。containerが削除されると、内部のすべてのデータが失われます。Docker volumeはcontainerの再起動や削除後も存続する永続ストレージを提供します。

名前付きVolumeの作成と使用

docker run -d --name db -v pgdata:/var/lib/postgresql/data postgres:16

これによりpgdataという名前付きvolume(まだ存在しない場合)が作成され、container内の/var/lib/postgresql/dataにマウントされます。PostgreSQLはこのディレクトリにデータファイルを保存するため、containerが削除されて再作成されてもデータは永続化されます。

Volumeのライフサイクル

名前付きvolumeはcontainerから独立して管理されます:

docker volume create mydata           # 明示的に作成
docker volume ls                       # すべてのvolumeを一覧表示
docker volume inspect pgdata           # volumeの詳細を表示
docker volume rm pgdata                # volumeを削除
docker volume prune                    # 未使用のvolumeを削除

volumeは明示的に削除されるまで永続化されます。containerを削除しても、関連するvolumeは削除されません

Container間でのVolume共有

複数のcontainerが同じvolumeを同時にマウントできます:

docker run -d --name writer -v shared-data:/data my-writer-app
docker run -d --name reader -v shared-data:/data my-reader-app

両方のcontainerが/data内の同じファイルを参照します。これにより以下のようなパターンが可能になります:

  • Webサーバーとコンテンツ管理システムが静的ファイルディレクトリを共有する。
  • ログ書き込みアプリとログ処理アプリがログディレクトリを共有する。

Volumeマウントの構文

-vフラグ(およびより詳細な--mount)はいくつかのフォーマットをサポートしています:

# 名前付きvolume
-v volume-name:/container/path

# 読み取り専用の名前付きvolume
-v volume-name:/container/path:ro

# 匿名volume(自動生成名)
-v /container/path

# --mountを使用(より明示的)
--mount type=volume,source=volume-name,target=/container/path

VolumeとBind Mountの比較

機能 名前付きVolume Bind Mount
Dockerが管理 はい いいえ
ホスト上の場所 Docker管理(/var/lib/docker/volumes/ 任意のホストパス
事前データ反映 はい(imageの内容をコピー) いいえ(ホストの内容で上書き)
バックアップ docker volumeコマンド 標準のファイルツール
macOS/Windowsでの性能 最適化済み 低速(ファイルシステム変換)

名前付きVolumeを使うべき場面

  • データベースストレージ(PostgreSQL、MySQL、MongoDBのデータディレクトリ)
  • アプリケーション状態(ファイルアップロード、生成ファイル)
  • 関連container間の共有データ
  • CI/CDキャッシュ(node_modules、ビルドアーティファクト)

バックアップとリストア

一時containerにvolumeをマウントしてバックアップします:

docker run --rm -v pgdata:/data -v $(pwd):/backup ubuntu tar czf /backup/pgdata.tar.gz -C /data .

アーカイブをvolumeに展開してリストアします:

docker run --rm -v pgdata:/data -v $(pwd):/backup ubuntu tar xzf /backup/pgdata.tar.gz -C /data

ユースケース

開発プロジェクトでPostgreSQLデータベースをDockerで実行し、containerの更新やホストマシンの再起動後も手動バックアップなしでデータベースデータが永続化されるようにする場合に使用します。

試してみる — Docker Run Command Builder

フルツールを開く