🐈

【Docker】データの永続化方法 - ボリュームとバインドマウントの選び方 -

2024/12/14に公開

はじめに

コンテナを停止するたびにDBのデータが消えてしまう問題に直面したことをきっかけに、Dockerでのデータ永続化について学習しました。本記事では、データ永続化を実現する方法として、「ボリューム」と「バインドマウント」の違いや選び方について解説します。

データを永続化する方法

Dockerでデータを永続化する方法には、大きく2つあります。

  1. ボリュームを使用する方法
  2. バインドマウントを使用する方法

簡単に言うと、ボリュームはDockerがデータを管理する方法で、バインドマウントはホストマシンがデータを管理する方法です。それぞれの違いとメリット・デメリットについて説明します。以下の図は公式ドキュメントから引用したものです。

ボリュームとは

ボリュームは、Dockerがホストマシン上に専用の保存場所を作り、そこでデータを管理する方法です。

ボリュームの設定例

docker-compose.yml
services:
  db:
    image: mysql:8.0
    volumes:
      - db_data:/var/lib/mysql
volumes:
  db_data:

ボリュームのメリット

  • 管理が簡単: データの保存先をDockerが管理してくれるので、ホスト側のフォルダ構造を気にしなくてよい。
  • 可搬性が高い: 別のホストにプロジェクトを移動する場合も、ボリュームをエクスポート/インポートするだけでデータを保持できる。
  • セキュリティ: ホストのファイルシステムと分離されているため、ホストの意図しない変更を防げる。

ボリュームのデメリット

  • 直接アクセスがやや面倒: ホストマシンからボリューム内のファイルにアクセスするには、Dockerコマンドが必要となる。
  • バックアップの手間: ボリュームのバックアップにはDocker特有のコマンドが必要となる。

バインドマウントとは

バインドマウントとは、ホストマシン上のディレクトリをそのままコンテナにマウントする方法です。

バインドマウントの設定方法

docker-compose.yml
services:
  db:
    image: mysql:8.0
    volumes:
      - ./db_data:/var/lib/mysql

バインドマウントのメリット

  • データの可視性: データがホスト側にそのままあるため、ファイルを直接確認・編集できる。
  • バックアップが容易: ファイルやディレクトリのコピー&ペーストでバックアップが取れる。
  • デバッグしやすい: MySQLのデータファイルやログをホスト上で直接確認できる。

バインドマウントのデメリット

  • 環境に依存しやすい: 別のマシンで同じディレクトリ・ファイル構造にすることが難しいこともある。
  • パフォーマンス低下の可能性: ホストとコンテナ間で頻繁にファイルをやり取りする場合、特にWindowsやMacではパフォーマンスが低下する可能性がある。
  • セキュリティリスク: ホストのディレクトリを直接触ることができるため、意図せず変更してしまうリスクがある。

結論: 選び方

どちらを選ぶかは、プロジェクトの状況によるかと思います。私なりのおすすめをまとめました。

  1. 本番環境やチーム開発の場合
    ボリュームをおすすめします。
    理由: 構成がシンプルで、意図せず編集する可能性が低く、セキュリティや移植性が高いためです。
  2. 個人開発や検証用の場合
    バインドマウントをおすすめします。
    理由: データの可視性や編集の手軽さが優れており、自身のみがコードを触るためメンバー間の環境の違いを気にする必要がないためです。

まとめ

Dockerでのデータ永続化には、ボリュームとバインドマウントの2つがあります。それぞれ特徴が違うため、プロジェクトに合った方法を選ぶと良いと思います。私個人の意見が含まれているため、異なった意見もあるかと思いますが、その際はコメントに記載いただけますと幸いです。

参考文献

https://docs.docker.jp/storage/volumes.html
https://docs.docker.jp/storage/bind-mounts.html
https://zenn.dev/keisuke_suzuki/articles/be5df49ceef149

GitHubで編集を提案

Discussion