Dockerストレージ

Volume、Bind Mount、tmpfs

データ永続化の必要性

コンテナはエフェメラル(一時的)な存在です。 コンテナを削除すると、その中のデータも消えます。 データベースやアプリケーションデータを永続化するには、 ストレージをコンテナの外部に置く必要があります。

ストレージタイプ

Volume(推奨)

  • • Dockerが管理する専用領域(/var/lib/docker/volumes/)
  • • ホストのファイルシステムから独立
  • • バックアップ・移行が容易
  • • Linux/Windowsで動作
  • • 複数コンテナで共有可能

Bind Mount

  • • ホストの任意のディレクトリをマウント
  • • 開発時のソースコード共有に便利
  • • ホストのパスに依存(ポータビリティ低い)
  • • ホスト側のファイル変更がすぐ反映

tmpfs Mount

  • • メモリ上にマウント(ディスクに書き込まない)
  • • コンテナ停止で消える
  • • 機密データの一時保存に適する
  • • 高速だがサイズ制限あり

ストレージ構造

Container FS(書き込み可能レイヤー)コンテナ削除で消える
Volume
/var/lib/docker/volumes/
Bind Mount
/home/user/app
tmpfs
memory
Host File System

Volume操作

1# ボリューム作成
2docker volume create myvolume
3
4# ボリューム一覧
5docker volume ls
6
7# ボリューム詳細
8docker volume inspect myvolume
9
10# ボリュームを使ってコンテナ起動
11docker run -d --name db \
12 -v myvolume:/var/lib/postgresql/data \
13 postgres:15
14
15# 匿名ボリューム(名前なし)
16docker run -d -v /data nginx
17
18# ボリューム削除
19docker volume rm myvolume
20
21# 未使用ボリューム一括削除
22docker volume prune

Bind Mount

1# 基本形式(-v)
2docker run -d -v /host/path:/container/path nginx
3
4# --mount 形式(推奨、より明示的)
5docker run -d --mount type=bind,src=/host/path,dst=/container/path nginx
6
7# 読み取り専用
8docker run -d -v /host/path:/container/path:ro nginx
9docker run -d --mount type=bind,src=/host/path,dst=/container/path,readonly nginx
10
11# 開発時の例:ソースコードをマウント
12docker 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マウント
2docker run -d --tmpfs /tmp nginx
3
4# --mount形式
5docker run -d --mount type=tmpfs,dst=/tmp nginx
6
7# サイズ制限付き
8docker run -d --mount type=tmpfs,dst=/tmp,tmpfs-size=100m nginx

Docker Composeでの使用

docker-compose.yml
yaml
1version: '3.8'
2
3services:
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# ボリューム定義
22volumes:
23 db-data:
24 # ドライバー指定(オプション)
25 driver: local
26 node_modules:

バックアップとリストア

1# ボリュームのバックアップ
2docker run --rm \
3 -v myvolume:/data \
4 -v $(pwd):/backup \
5 alpine tar cvf /backup/backup.tar /data
6
7# リストア
8docker run --rm \
9 -v myvolume:/data \
10 -v $(pwd):/backup \
11 alpine tar xvf /backup/backup.tar -C /
12
13# ボリュームの中身を確認
14docker run --rm -v myvolume:/data alpine ls -la /data

SRE/インフラ観点

ベストプラクティス

  • • 本番環境では必ず名前付きVolumeを使用
  • • データベースは必ず永続化
  • • Bind Mountは開発環境のみ
  • • 機密データの一時保存にはtmpfs

Volume vs Bind Mount

項目VolumeBind Mount
管理Dockerユーザー
ポータビリティ高い低い
バックアップ容易手動
用途本番開発

ディスク容量監視

  • docker system df で使用量確認
  • docker volume prune で未使用削除
  • • /var/lib/docker/ の容量監視