はじめに
DockerでMySQLやPostgreSQLなどのデータベースを構築する際、コンテナを削除するとデータも一緒に消えてしまうという問題に直面することがあります。
この問題を解決するためには、**「データの永続化」**が重要です。
この記事では、Dockerのボリューム機能を活用してデータを安全に保持する方法を解説します。
1. なぜ永続化が必要なのか
Dockerコンテナは基本的に**「使い捨て」**の設計です。
そのため、docker rm
や再デプロイを行うと、内部のデータは消えてしまいます。
たとえば次のようなケースです:
docker run --name mydb -e MYSQL_ROOT_PASSWORD=root -d mysql:8
このコンテナを削除して再作成すると、MySQL内部のテーブルやデータはすべて失われます。
これを防ぐには、データディレクトリをホスト側にマウントする必要があります。
2. ボリュームを使った永続化
Dockerには2種類の永続化方法があります。
(1) 名前付きボリューム
Dockerが自動で管理するストレージ領域を使う方法です。
docker volume create mysql_data
docker run -d \
--name mysql_server \
-e MYSQL_ROOT_PASSWORD=root \
-v mysql_data:/var/lib/mysql \
mysql:8
これにより、mysql_data
というボリュームにデータが保存され、コンテナを削除してもデータは残ります。
(2) バインドマウント
ホストの特定ディレクトリを直接マウントする方法です。
mkdir -p ~/docker/mysql_data
docker run -d \
--name mysql_local \
-e MYSQL_ROOT_PASSWORD=root \
-v ~/docker/mysql_data:/var/lib/mysql \
mysql:8
この方法では、ホスト上の~/docker/mysql_data
にデータが書き込まれるため、直接バックアップや編集が可能です。
3. docker-composeでの永続化設定
複数コンテナを扱う場合は、docker-compose.yml
を使って管理するのが便利です。
version: '3.8'
services:
db:
image: mysql:8
container_name: mysql_db
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: app_db
volumes:
- db_data:/var/lib/mysql
ports:
- "3306:3306"
volumes:
db_data:
docker-compose up -d
で起動後、docker-compose down
してもdb_data
ボリュームは残るため、再度up
すれば同じデータを参照できます。
4. データ永続化のベストプラクティス
- バックアップを定期的に取得する
永続化しても障害は起こり得るため、mysqldump
やpg_dump
を使って定期的にバックアップしましょう。 - ボリュームを明示的に管理する
docker volume ls
やdocker volume inspect
で状態を確認し、不要なボリュームを削除する習慣を。 - 本番環境ではバインドマウントよりも名前付きボリュームを推奨
OS依存が少なく、コンテナ移動が容易になるためです。
5. トラブルシューティング
- 権限エラーが出る場合は、ホストディレクトリの権限を確認。
例:sudo chown -R 999:999 ~/docker/mysql_data
(MySQL UIDに合わせる) - ボリュームのデータ確認
docker run -it --rm -v mysql_data:/data alpine sh
→/data
配下で中身を確認可能。
6. 次のステップ
永続化の基礎を理解したら、以下のステップに進むとより実践的です。
docker-compose
でアプリ+DB構成(例:Node.js + MySQL)を構築- バックアップ自動化(cron + dump)
- クラウドストレージ連携によるデータ保全(AWS S3など)
まとめ
Dockerでデータベースを安全に運用するには、ボリュームによる永続化が不可欠です。
コンテナの再作成や更新が頻繁な環境でも、適切なボリューム設定によりデータを確実に保持できます。
本番運用では、ボリューム管理・バックアップ・セキュリティまで含めた包括的な運用設計が鍵となります。
コメントを残す