Skip to main content

第19章:バックアップ/リストア超入門(最小でOK)💾

この章でやるのは、**「最小の保険」**を作ることだよ🛡️✨ DBみたいな「消えたら泣くデータ😭」だけ、サクッと退避 → もしもの時に戻すまでを一周します🔁


この章のゴール🎯✨

  • ボリュームの中身をバックアップできる(1ファイルにする)📦
  • バックアップから復元できる(新しいボリュームに戻して確認)🧪
  • ✅ DBの場合、より安全な pg_dump バックアップもできる😎

まず最初に:バックアップは2種類あるよ🧠💡

① ボリューム丸ごと(tarで固める)📦🧊

  • 速い・簡単・雑に強い💪
  • ただしDBを動かしたままだと、タイミング次第で壊れた状態を固めることがある⚠️(なので基本は止めてから)

Docker公式も — --volumes-from でボリュームをマウントした一時コンテナを作り、tarで固める方法を案内してるよ。(Docker Documentation)

② DBとして安全に(pg_dumpで論理バックアップ)🧠🧰

  • DB的に「一貫したバックアップ」が取りやすい✅
  • pg_dump同時アクセスがあっても一貫したエクスポートを作れるって明言されてる(開発では超ありがたい)(PostgreSQL)
  • -Fc(custom形式)が柔軟でおすすめ(圧縮も効く)(PostgreSQL)

ハンズオン①:ボリュームを「1ファイル」にして復元する📦➡️💾➡️📦

ここでは Todo API のDB用ボリュームを想定して進めるよ🙂 (例:Postgresコンテナ名 todo-db、ボリューム名 todo_pgdata


0) まず確認👀(ボリューム名を間違えると事故る😇)

docker volume ls
docker ps -a

1) DBを止める🛑(tarバックアップの安全度UP)

docker stop todo-db

DBみたいな「書き込みが走るもの」は、止めてから固めるのが安心👍


2) バックアップ先フォルダを作る📁✨

WSLターミナルなら:

mkdir -p backup

PowerShellなら:

mkdir backup

3) ボリュームをtar.gzに固める💾📦

✅ いちばん事故りにくい型(「ボリューム→/volume」「バックアップ→/backup」)

WSLターミナル

docker run --rm \
-v todo_pgdata:/volume \
-v "$(pwd)/backup:/backup" \
alpine sh -c 'tar czf /backup/todo_pgdata.tar.gz -C /volume .'

PowerShell

docker run --rm `
-v todo_pgdata:/volume `
-v "${PWD}\backup:/backup" `
alpine sh -c "tar czf /backup/todo_pgdata.tar.gz -C /volume ."

ポイントは -C /volume . で「余計なパスを入れない」こと👍 これ、復元がラクになる✨

Docker公式も、同じ発想で「一時コンテナを立ててtarで固める」を推してるよ。(Docker Documentation)


4) バックアップできたか確認✅👀

ls -lh backup
tar tzf backup/todo_pgdata.tar.gz | head

5) 復元(安全のため “新しいボリューム” に戻す)🧪✨

5-1) 復元先ボリュームを作る🆕

docker volume create todo_pgdata_restored

5-2) tar.gz を展開して戻す📦➡️📂

WSLターミナル

docker run --rm \
-v todo_pgdata_restored:/volume \
-v "$(pwd)/backup:/backup" \
alpine sh -c 'tar xzf /backup/todo_pgdata.tar.gz -C /volume'

公式例でも “tarを展開して復元” を案内してる(考え方は同じ)(Docker Documentation)


6) 復元したボリュームでDBを起動して確認🔍🎉

docker run --name todo-db-restoretest \
-e POSTGRES_PASSWORD=pass \
-e POSTGRES_DB=todo \
-p 5433:5432 \
-v todo_pgdata_restored:/var/lib/postgresql/data \
-d postgres:17

確認(例):

docker exec -it todo-db-restoretest psql -U postgres -d todo -c "\dt"

ハンズオン②:pg_dump で「DBとして安全」にバックアップする🧠💾

「tar方式は簡単だけど、DBとしては pg_dump が安心」って使い分けができると強い💪✨ pg_dump同時利用中でも一貫したエクスポートが作れるよ。(PostgreSQL)


1) pg_dump(custom形式 -Fc)でバックアップ📦✨

mkdir -p backup
docker exec -t todo-db pg_dump -U postgres -d todo -Fc > backup/todo.dump
  • -Fc(custom形式)は柔軟でおすすめ(圧縮・選択復元にも強い)(PostgreSQL)

2) pg_restore でリストア🔁✨

「DBを作り直してから戻す」が分かりやすい🙂 まず空のDBを用意(例:todoを作り直す):

docker exec -it todo-db psql -U postgres -c "DROP DATABASE IF EXISTS todo;"
docker exec -it todo-db psql -U postgres -c "CREATE DATABASE todo;"

復元(stdinで流し込み):

cat backup/todo.dump | docker exec -i todo-db pg_restore -U postgres -d todo

pg_restoreファイル名を指定しなければ標準入力を使うって仕様になってるよ。(PostgreSQL)


⚠️注意:知らないdumpは復元しない🙅‍♂️

pg_restore は「復元時に任意コードが実行されうる」ので、信頼できるdumpだけにしようね🧯😨(PostgreSQL)


よくある事故ポイント集🪤😵‍💫(先に潰す!)

  • バックアップ先をボリューム内にしてしまい、自己圧縮ループ♾️ → /backup は必ずホスト側フォルダをマウント!
  • ❌ DB動かしたままtarで固めて、たまに壊れる⚡ → tar方式は基本 docker stop してから
  • ❌ 復元先のボリュームを間違えて上書き😇 → まず *_restored みたいに新規ボリュームへ
  • ❌ PowerShellのパス指定でコケる🪟 → "${PWD}\backup:/backup" を使う(引用符も大事)

“最小の保険ルール” テンプレ📜✨

これだけ守れば、個人開発の安心度が一気に上がるよ🙂💕

  • 危険操作の前(volume削除/初期化/大きなマイグレーション前)に1回バックアップ💾
  • ✅ バックアップファイル名に日付を入れる🗓️ 例:todo_pgdata_2026-02-08.tar.gz
  • ✅ “復元テスト” をたまにやる(新ボリュームへ)🧪 「戻せる」確認がいちばん大事!

AI活用(この章のためのプロンプト例)🤖✨

  • todo_pgdatabackup/ に日付付きで保存する WSL用ワンライナーに短縮して」
  • 「PowerShellで同じことをするコマンドに変換して(改行も含めて)」
  • 「この docker run ... tar ... を実行したら失敗した。ログ貼るので原因候補トップ3と確認手順を出して」
  • 「復元の安全手順をチェックリスト化して(初心者向けに短く)」

ミニ理解チェック🎓✅

  1. tar方式バックアップの前にDBを止める理由は?🛑
  2. 事故りにくい復元のやり方は「同じボリュームに上書き」or「新ボリュームへ復元」どっち?🧪
  3. pg_dump -Fc のメリットを1つ言える?📦
  4. バックアップファイルができたか確認するコマンドは?👀
  5. 何も考えずに docker volume rm していいのはどんなデータ?🗑️🙂

おまけ:Docker Desktop丸ごと引っ越し(最終手段)🧳💽

「PC移行」「Docker Desktop更新で壊れた」みたいな時は、Docker Desktop自体のバックアップ手順も公式にあるよ。 ただし、コンテナをcommitしてもボリュームの中身は入らないので、ボリュームは別途バックアップが必要だよ。(Docker Documentation) WindowsでDocker Desktopが起動しない時のバックアップ先として docker_data.vhdx のパス例も載ってる。(Docker Documentation)


次の第20章は、この章で作った「保険」を含めて、**“自分のデータ運用ルール1枚”**に落とし込んでいくよ📜✨