Dockerではコンテナを削除すると基本的に中のデータも消えてしまいます。開発環境や本番環境でデータベースやアップロードファイルを保持するには、データをコンテナ外に保存する仕組みが必要です。その代表的な方法が「volume(ボリューム)」です。ここではDocker volumeの基本とデータ永続化の考え方を解説します。
volumeとは
volumeはコンテナの外に用意される永続ストレージ領域です。コンテナ内部の特定ディレクトリとマウントすることで、コンテナのライフサイクルとは独立してデータを保持できます。これによりコンテナを削除・再作成してもデータは失われません。
volumeを作成する
Docker CLIからvolumeを作成するには以下のコマンドを使います。
# volumeの作成
docker volume create mydata
# volumeの一覧
docker volume ls
# volumeの詳細
docker volume inspect mydata
コンテナにvolumeをマウントする
コンテナ起動時に -v オプションでマウントできます。左がvolume名、右がコンテナ内のマウント先です。
# MySQLコンテナにvolumeをマウント
docker run -d \
--name mydb \
-e MYSQL_ROOT_PASSWORD=rootpass \
-v mydata:/var/lib/mysql \
mysql:8.0
この例ではMySQLのデータディレクトリをvolumeに保存しているため、コンテナを削除してもデータは残ります。
docker-composeでのvolume定義
Composeファイルではvolumesセクションで定義し、servicesごとにマウントできます。
version: "3.9"
services:
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootpass
volumes:
- db_data:/var/lib/mysql
volumes:
db_data:
この場合、db_dataという名前のvolumeが自動で作成され、MySQLのデータを保持します。
bind mountとの違い
volumeと似た仕組みにbind mountがあります。bind mountはホストマシン上の特定ディレクトリをそのままマウントします。開発中のソースコード共有には便利ですが、環境依存しやすく、管理性ではvolumeの方が優れています。
volumeの削除
不要になったvolumeは手動で削除します。コンテナ削除時には残るため、定期的に掃除が必要です。
# 単一削除
docker volume rm mydata
# 未使用volumeの一括削除
docker volume prune
volume利用のベストプラクティス
– データベースやアップロードファイルは必ずvolumeで永続化する
– 開発中のソース共有にはbind mount、本番のデータ永続化にはvolumeを使い分ける
– volume名を明示的に指定して管理性を高める
– 定期的に未使用volumeを整理し、ディスク容量を圧迫しないようにする
まとめ
Dockerのvolumeはコンテナを超えてデータを保持できる仕組みです。データベースやストレージ領域を安全に運用するには必須の機能であり、Composeを使えば簡単に導入できます。bind mountと使い分けながら、開発・本番環境の双方で活用すると効率的です。