Dockerで作るRDS風環境(Dump復元方式)のメリット・デメリット
Docker 上に空の RDS 風データベース環境を構築し、
Dump ファイルからデータを復元する方式についてまとめる。
イメージ
- volume 未指定の場合(データは毎回消える)
┌──────────────────────────────┐
│ PostgreSQL コンテナ │
│ /var/lib/postgresql/data │ ← データはコンテナ内部に保存
└──────────────────────────────┘
コンテナ削除
↓
データも一緒に消える(揮発)
- volume 指定の場合(データは残る)
┌──────────────────────────────┐
│ PostgreSQL コンテナ │
│ /var/lib/postgresql/data │
└───────────────┬──────────────┘
│ bind mount / volume
▼
┌──────────────────────────────┐
│ Docker Volume (pgdata) │ ← データはここに永続化
└──────────────────────────────┘
コンテナ削除
↓
データは volume に残る(永続)
✔️ メリット
1. 環境の再現性が高い
Dump ファイルがあれば、どの環境でも同じデータ状態を再構築できる。
開発・検証環境の統一が容易。
2. データの可搬性が高い
Dump は単一ファイルのため、Git 管理・共有・移行が簡単。
CI/CD パイプラインにも組み込みやすい。
3. バックアップとして安定
Dump は volume より破損リスクが低く、
長期保存や履歴管理に向いている。
4. 不要なデータを持ち込まないクリーンな環境を作れる
毎回空の DB に対して Dump を流すため、
テストデータやゴミデータが混入しない。
❌ デメリット
1. 復元に時間がかかる
Dump のサイズが大きいほど復元時間が増加する。
数分〜数十分かかるケースもあり、起動が遅くなる。
2. RDS のような高速起動はできない
Dump 復元処理が必須のため、
コンテナ起動 → DB 復元 → 利用可能
というステップが必要になる。
3. Dump の整合性管理が必要
Dump の更新忘れ、差分の取り扱い、
複数環境でのバージョン不一致などが発生しやすい。
4. 復元失敗時のトラブルシュートが面倒
Dump の破損、文字コード問題、外部キー制約などで
復元が途中で止まる場合があり、原因特定が難しい。
5. volume が毎回生成されるため、定期的なクリーンアップが必要
Dump 復元方式では、
「空の DB を作る → Dump を流す」という流れのため、
コンテナ再作成のたびに新しい volume が増えていく。
放置すると以下の問題が発生する:
- 不要 volume が蓄積し、ディスク容量を圧迫
- volume 名が増え続けて管理が煩雑
- CI/CD や自動テスト環境では特に肥大化しやすい
そのため、
docker volume prune
などによる 定期的な volume クリーンアップが必須 となる。
まとめ(Dump復元方式の特徴)
| 項目 | 内容 |
|---|---|
| 再現性 | 高い |
| 起動速度 | 遅い(Dump復元が必要) |
| 永続性 | Dump管理次第 |
| 本番向きか | △(復元時間がネック) |
| テスト向きか | ◎(毎回クリーンな環境) |
| データ移行 | 容易 |
| volume管理 | 定期的なクリーンが必要 |
サンプルファイル
postgre SQLに関するサンプルファイルを提示
- docker-compose.yml(Dump復元前提の構成)
version: "3.9"
services:
postgres:
build: .
container_name: pg-docker
ports:
- "5432:5432"
volumes:
- pgdata:/var/lib/postgresql/data
- ./dump:/dump # Dumpファイルを置くディレクトリ
environment:
POSTGRES_USER: appuser
POSTGRES_PASSWORD: apppass
POSTGRES_DB: appdb
- Dump 復元用シェル(restore.sh)
#!/bin/bash
DUMP_FILE="./dump/appdb_dump.sql"
if [ ! -f "$DUMP_FILE" ]; then
echo "Dumpファイルが存在しません: $DUMP_FILE"
exit 1
fi
echo "PostgreSQL に Dump を復元します..."
docker exec -i pg-docker psql -U appuser -d appdb < "$DUMP_FILE"
echo "復元完了"
- Dump 出力用シェル(dump.sh)
#!/bin/bash
OUTPUT="./dump/appdb_dump.sql"
echo "Dump を出力します..."
docker exec pg-docker pg_dump -U appuser appdb > "$OUTPUT"
echo "Dump 出力完了: $OUTPUT"
- ディレクトリ構成例
project/
├── Dockerfile
├── docker-compose.yml
├── dump/
│ └── appdb_dump.sql # Dumpファイル(復元・出力用)
├── restore.sh
└── dump.sh