【Docker】volumeの使い方とデータ永続化の基本

Docker

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と使い分けながら、開発・本番環境の双方で活用すると効率的です。