Docker VolumeとBind Mountの違い、使い分け方

問題

Dockerでデータを永続化するにはボリュームが必要ですが、volumebind 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の方がセキュリティ面で安全です