docker-compose.ymlでボリュームを定義する方法を徹底解説

はじめに

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など)によるカスタム構成を試す

投稿日

カテゴリー:

投稿者:

タグ:

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です