Dockerストレージ
Volume、Bind Mount、tmpfs
データ永続化の必要性
コンテナはエフェメラル(一時的)な存在です。 コンテナを削除すると、その中のデータも消えます。 データベースやアプリケーションデータを永続化するには、 ストレージをコンテナの外部に置く必要があります。
ストレージタイプ
Volume(推奨)
- • Dockerが管理する専用領域(/var/lib/docker/volumes/)
- • ホストのファイルシステムから独立
- • バックアップ・移行が容易
- • Linux/Windowsで動作
- • 複数コンテナで共有可能
Bind Mount
- • ホストの任意のディレクトリをマウント
- • 開発時のソースコード共有に便利
- • ホストのパスに依存(ポータビリティ低い)
- • ホスト側のファイル変更がすぐ反映
tmpfs Mount
- • メモリ上にマウント(ディスクに書き込まない)
- • コンテナ停止で消える
- • 機密データの一時保存に適する
- • 高速だがサイズ制限あり
ストレージ構造
Container FS(書き込み可能レイヤー)コンテナ削除で消える
Volume
/var/lib/docker/volumes/
/var/lib/docker/volumes/
Bind Mount
/home/user/app
/home/user/app
tmpfs
memory
memory
Host File System
Volume操作
1 # ボリューム作成 2 docker volume create myvolume 3 4 # ボリューム一覧 5 docker volume ls 6 7 # ボリューム詳細 8 docker volume inspect myvolume 9 10 # ボリュームを使ってコンテナ起動 11 docker run -d --name db \ 12 -v myvolume:/var/lib/postgresql/data \ 13 postgres:15 14 15 # 匿名ボリューム(名前なし) 16 docker run -d -v /data nginx 17 18 # ボリューム削除 19 docker volume rm myvolume 20 21 # 未使用ボリューム一括削除 22 docker volume prune
Bind Mount
1 # 基本形式(-v) 2 docker run -d -v /host/path:/container/path nginx 3 4 # --mount 形式(推奨、より明示的) 5 docker run -d --mount type=bind,src=/host/path,dst=/container/path nginx 6 7 # 読み取り専用 8 docker run -d -v /host/path:/container/path:ro nginx 9 docker run -d --mount type=bind,src=/host/path,dst=/container/path,readonly nginx 10 11 # 開発時の例:ソースコードをマウント 12 docker run -d \ 13 -v $(pwd)/src:/app/src \ 14 -p 3000:3000 \ 15 node:20-alpine npm run dev
Note: Bind Mountはホストのパスに依存するため、 本番環境ではVolumeを使用することを推奨します。
tmpfs Mount
1 # tmpfsマウント 2 docker run -d --tmpfs /tmp nginx 3 4 # --mount形式 5 docker run -d --mount type=tmpfs,dst=/tmp nginx 6 7 # サイズ制限付き 8 docker run -d --mount type=tmpfs,dst=/tmp,tmpfs-size=100m nginx
Docker Composeでの使用
docker-compose.yml
yaml
1 version: '3.8' 2 3 services: 4 db: 5 image: postgres:15 6 volumes: 7 # 名前付きボリューム 8 - db-data:/var/lib/postgresql/data 9 10 web: 11 build: . 12 volumes: 13 # Bind Mount(開発用) 14 - ./src:/app/src 15 # 名前付きボリューム(node_modulesを分離) 16 - node_modules:/app/node_modules 17 # tmpfs 18 - type: tmpfs 19 target: /tmp 20 21 # ボリューム定義 22 volumes: 23 db-data: 24 # ドライバー指定(オプション) 25 driver: local 26 node_modules:
バックアップとリストア
1 # ボリュームのバックアップ 2 docker run --rm \ 3 -v myvolume:/data \ 4 -v $(pwd):/backup \ 5 alpine tar cvf /backup/backup.tar /data 6 7 # リストア 8 docker run --rm \ 9 -v myvolume:/data \ 10 -v $(pwd):/backup \ 11 alpine tar xvf /backup/backup.tar -C / 12 13 # ボリュームの中身を確認 14 docker run --rm -v myvolume:/data alpine ls -la /data
SRE/インフラ観点
ベストプラクティス
- • 本番環境では必ず名前付きVolumeを使用
- • データベースは必ず永続化
- • Bind Mountは開発環境のみ
- • 機密データの一時保存にはtmpfs
Volume vs Bind Mount
| 項目 | Volume | Bind Mount |
|---|---|---|
| 管理 | Docker | ユーザー |
| ポータビリティ | 高い | 低い |
| バックアップ | 容易 | 手動 |
| 用途 | 本番 | 開発 |
ディスク容量監視
- •
docker system dfで使用量確認 - •
docker volume pruneで未使用削除 - • /var/lib/docker/ の容量監視