Dockerでコンテナのデータを永続化する方法には「bind mount」と「volume」の2種類があります。どちらもホストとコンテナ間でファイルやディレクトリを共有できますが、仕組みや用途に違いがあります。ここではその違いと、どのように使い分ければよいかを解説します。
bind mountとは
bind mountはホスト側の特定のパスをコンテナにそのままマウントする仕組みです。開発中のソースコードをコンテナ内で動かしたい場合など、ホストのファイルを直接参照する用途に向いています。
docker run -d \
-v /path/on/host:/app \
myapp:latest
この例ではホストの`/path/on/host`ディレクトリがコンテナ内の`/app`として利用できます。ホスト側でファイルを編集すると即座にコンテナに反映されます。
volumeとは
volumeはDockerが管理する専用のストレージ領域にデータを保存する方法です。ホストの任意のパスではなく、Dockerエンジンが管理する場所(通常は`/var/lib/docker/volumes/`以下)にデータが作られます。
# ボリュームを作成
docker volume create mydata
# コンテナにマウント
docker run -d \
-v mydata:/var/lib/mysql \
mysql:8.0
volumeはコンテナを削除してもデータが残り、バックアップや移行が容易です。Docker Composeでも推奨される方法です。
bind mountのメリット・デメリット
メリットはホストのファイルを直接参照できること。開発中にコードを即時反映でき、ホスト環境のツールで編集可能です。デメリットはホストのパスに依存するため、環境移行が難しい点や、権限設定による不具合が起こりやすい点です。
volumeのメリット・デメリット
メリットはDockerが一元的に管理するため、環境差異が少なく本番運用に適していること。コンテナ間でデータを共有する場合にも便利です。デメリットはホストの特定ファイルを直接編集しにくいことですが、`docker cp`や一時的なコンテナを使えばアクセス可能です。
使い分けの指針
- 開発環境:ソースコードを即座に反映させたい → bind mount
- 本番環境:DBやアプリケーションデータを安全に永続化したい → volume
- 複数のコンテナでデータを共有したい → volume
- ホスト上の特定ディレクトリを利用する必要がある → bind mount
まとめ
bind mountはホストのファイルを直接使いたい開発用途に向き、volumeはDocker管理下で安定したデータ永続化を実現する本番用途に向きます。場面に応じて正しく使い分けることで、開発効率と運用の安定性を両立できます。