はじめに
Docker Composeを利用すると、複数のコンテナを一括で起動・停止・設定できるため、開発・テスト・本番環境の構築が非常に効率化されます。
しかし、コンテナは原則として一時的(ephemeral)な存在です。コンテナを削除すると内部データも失われてしまうため、データベースやログファイルを扱うアプリケーションでは、データを永続化する仕組みが欠かせません。
そこで登場するのが、Dockerボリューム(Volume)です。
この記事では、docker-compose.yml
ファイルを使ってボリュームを定義し、データを永続化・共有する方法を実践形式で詳しく解説します。
1. ボリュームとは何か?
Dockerボリュームとは、コンテナの外部にデータを保存できる仕組みです。
これにより、コンテナを削除してもデータは保持され、他のコンテナからも共有可能になります。
ボリュームの主な特徴
- データの永続化:コンテナ再作成後もデータを保持できる
- 共有の容易さ:複数のコンテナ間でデータを共有可能
- ホスト依存の低減:アプリケーションを環境に依存させない
特にMySQLやPostgreSQLなどのデータベースコンテナ、あるいはログ・設定ファイルを扱うアプリケーションで頻繁に利用されます。
2. docker-compose.ymlでのボリューム定義の基本
docker-compose.yml
では、サービス(services)ごとに使用するボリュームを指定し、さらにルートレベルでボリュームの定義を行うことで、Compose全体で管理できます。
以下が最も基本的な例です。
version: '3.9'
services:
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: example
volumes:
- db_data:/var/lib/mysql
volumes:
db_data:
解説
db_data
はボリューム名/var/lib/mysql
はMySQLのデータ格納ディレクトリvolumes:
セクションでdb_data
を定義することで、自動的に作成されます
この設定で、MySQLのデータはホストや他のコンテナをまたいでも保持されます。
3. ハンズオン:アプリとデータベースをボリュームでつなぐ
実際にボリューム定義を使ったシンプルな構成を試してみましょう。
ディレクトリ構成
project/
├─ docker-compose.yml
├─ app/
│ └─ index.html
docker-compose.ymlの内容
version: '3.9'
services:
web:
image: nginx:alpine
ports:
- "8080:80"
volumes:
- ./app:/usr/share/nginx/html:ro
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: password
volumes:
- db_storage:/var/lib/mysql
volumes:
db_storage:
実行手順
docker compose up -d
コンテナが起動したら、ブラウザで以下にアクセスします。
http://localhost:8080
app/index.html
の内容が表示されれば、ホストのファイルをコンテナにマウントできています。
さらに、MySQLのデータは db_storage
ボリュームに永続化されます。
4. 応用編:外部ボリュームの利用
既に作成済みのボリュームを外部から利用することも可能です。
以下のように external: true
を指定します。
volumes:
shared_data:
external: true
この設定により、Composeは既存の shared_data
ボリュームを再利用します。
事前に以下のように作成しておきましょう。
docker volume create shared_data
この仕組みを使えば、複数のComposeプロジェクト間で共通のデータ領域を持たせることもできます。
CI/CD環境やマイクロサービス構成での再利用にも有効です。
5. ボリュームに関するトラブルシューティング
トラブル内容 | 主な原因 | 対処方法 |
---|---|---|
ボリュームが更新されない | 古いボリュームが残っている | docker compose down -v でボリューム削除後に再作成 |
Permission denied が発生 | マウント先の権限設定が不一致 | chmod や :rw オプションで書き込み権限を確認 |
外部ボリュームが見つからない | external指定ミスまたは未作成 | docker volume ls で存在確認し、必要なら作成 |
ボリュームの状態を確認するには、次のコマンドが便利です。
docker volume inspect db_storage
これにより、実際にどのパスにデータが保存されているかを確認できます。
6. まとめ
docker-compose.yml
でボリュームを定義することで、データの永続化や共有が容易になります。
特にチーム開発や本番運用環境では、ボリューム設計を正しく行うことがアプリケーションの安定性に直結します。
本記事のポイント
volumes:
セクションでデータ永続化を実現できる- Composeを使えば環境間の差異を吸収可能
- 外部ボリュームを使うことで柔軟な再利用も可能
次のステップ
より深く理解したい方は、次のテーマに進むとよいでしょう:
- named volume と bind mount の違いを実践的に比較する
- ボリュームのバックアップとリストアを自動化する方法を学ぶ
- tmpfsマウントやドライバー指定(local, nfsなど)によるカスタム構成を試す
コメントを残す