1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ローカルのDBを常にクリーンな環境で再生成する

1
Last updated at Posted at 2026-07-08

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

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?