Docker VolumeとBind Mountの違い、使い分け方
問題
Dockerでデータを永続化するにはボリュームが必要ですが、volumeとbind mountの違いが分かりにくいことがあります。
volumes:
- ./src:/app/src # これがbind mount
- db-data:/var/lib/mysql # これがnamed volume
解決方法
Bind Mountは、ホストの特定パスをコンテナに直接マウントします。
# 開発時 — コードの変更が即座に反映される
services:
app:
volumes:
- ./src:/app/src
- ./config:/app/config
ホストのファイルシステムに直接アクセスするため、コードを修正するとコンテナ内にも即座に反映されます。開発環境でのホットリロードに最適です。
Named Volumeは、Dockerが管理する別の保存領域です。
# 本番環境 — データベースのデータを保存
services:
db:
volumes:
- db-data:/var/lib/mysql
volumes:
db-data: # Dockerが管理
ホスト上のどこに保存されるか気にする必要はありません。Dockerが管理し、コンテナを削除してもデータは残ります。
よくある間違い
# これだとnode_modulesがホスト側のもので上書きされる
volumes:
- .:/app
# anonymous volumeで保護する必要がある
volumes:
- .:/app
- /app/node_modules # コンテナのnode_modulesを維持
ホスト全体をマウントすると、コンテナ内でnpm installによりインストールされたnode_modulesがホスト側の(空の)node_modulesで上書きされる問題が発生します。
ポイント
- Bind Mount: ホストパスを直接マウント。開発環境でのコード同期に適しています
- Named Volume: Docker管理のストレージ。本番環境でのデータ保存に適しています
- プロジェクトルートをマウントする際は、
node_modulesなどのディレクトリをanonymous volumeで保護しましょう - 本番環境ではbind mountよりnamed volumeの方がセキュリティ面で安全です