-vフラグによるDocker Volumeマウント
Docker名前付きvolumeを使用してcontainerデータを永続化する方法を学びます。volumeのライフサイクル、container間でのデータ共有、本番データにbind mountよりもvolumeが推奨される理由について解説します。
詳細な説明
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の更新やホストマシンの再起動後も手動バックアップなしでデータベースデータが永続化されるようにする場合に使用します。