メインコンテンツまでスキップ

第16章:リストア手順:戻せないバックアップは“無い”のと同じ😱

この章はズバリ、「バックアップから“ちゃんと戻せる手順”を、誰でも再現できる形にする」回です💪📦 バックアップがあっても、戻せなかったら実質ゼロですからね…🥶


この章のゴール🎯

  • 別名のボリュームに復元できる(元データを壊さない)🧯
  • 復元後に動作確認できる(DBなら接続&簡単なクエリ)✅
  • 安全に切り替えできる(Composeの設定でスイッチ)🔁

まず結論:リストアはこの順番が最強🧠✨

  1. 復元先は“新しいボリューム”(別名)を作る📦
  2. そこへ tar を展開して復元する🗜️➡️📂
  3. 起動して動作確認する🧪
  4. OKなら そっちに切り替える🔀
  5. 元のボリュームは しばらく残して保険🛟

この考え方は、公式ドキュメントでも「tarで固めたボリュームを別の入れ物へ展開して戻す」流れで紹介されています。(Docker Documentation)


ハンズオン:tarバックアップを“別名ボリューム”へ復元する🛠️😺

ここでは 第15章で作った backup.tar(または backup.tar.gz が手元にある前提で進めます📁 (※コンテナを commit しても ボリュームの中身は入らないので、ボリュームは別途こうやって戻します⚠️)(Docker Documentation)


0) 変数(名前)を決めよう✍️

  • いま使ってるボリューム:例 myapp_db_data
  • 復元先(新規):例 myapp_db_data_restore_20260211
  • バックアップファイル:例 backup.tar(または backup.tar.gz

1) いま動いてるサービスを止める🛑

復元対象のボリュームを使ってるコンテナは止めるのが鉄則です(書き込み中に上書きされると事故ります😵)

## 例:db サービスだけ止める
docker compose stop db

2) 復元先の“新ボリューム”を作る📦✨

$RESTORE_VOL="myapp_db_data_restore_20260211"
docker volume create $RESTORE_VOL
docker volume ls

「既存のボリュームに上書きしない」=最強の安全装置です🧯✨


3) バックアップの中身を“ちょい見”する👀(任意だけど超おすすめ)

まずは中身が読めるか確認! (ここで壊れてたら、復元手順が正しくても無理なので…😭)

## backup.tar の場合
docker run --rm -v ${PWD}:/backup ubuntu bash -lc "tar -tf /backup/backup.tar | head -n 20"

## backup.tar.gz の場合
docker run --rm -v ${PWD}:/backup ubuntu bash -lc "tar -tzf /backup/backup.tar.gz | head -n 20"
  • ファイル一覧が出ればOK🙆‍♂️
  • 何も出ない/エラーなら、そのバックアップは要注意⚠️

4) いよいよ復元(tar を展開)🗜️➡️📂

✅ パターンA:backup.tar の復元

$RESTORE_VOL="myapp_db_data_restore_20260211"

docker run --rm `
-v ${RESTORE_VOL}:/dbdata `
-v ${PWD}:/backup `
ubuntu bash -lc "cd /dbdata && tar xvf /backup/backup.tar --strip 1"

✅ パターンB:backup.tar.gz の復元

$RESTORE_VOL="myapp_db_data_restore_20260211"

docker run --rm `
-v ${RESTORE_VOL}:/dbdata `
-v ${PWD}:/backup `
ubuntu bash -lc "cd /dbdata && tar xzvf /backup/backup.tar.gz --strip 1"

--strip 1 って何?🤔 バックアップの作り方が tar cvf ... /dbdata みたいに“ディレクトリごと”入ってると、展開時に /dbdata/... の階層が残っちゃうことがあります。 公式の例でも、復元時に tar xvf ... --strip 1 を付けて階層を整えています。(Docker Documentation)


5) 動作確認:復元ボリュームで“起動して確かめる”🧪✅

ここがこの章のキモです🔥 「展開できた」=「動く」ではないので、起動して確認します😼

例:Postgresなら(超ざっくり確認)🐘

※あなたの構成に合わせて POSTGRES_PASSWORD 等は調整してOKです🔑

$RESTORE_VOL="myapp_db_data_restore_20260211"

## 復元ボリュームで Postgres を単体起動(テスト用)
docker run --rm -d --name pg-restore-test `
-e POSTGRES_PASSWORD=example `
-v ${RESTORE_VOL}:/var/lib/postgresql/data `
-p 15432:5432 `
postgres

## 接続できるか確認(psqlが無い場合はコンテナ内から)
docker exec -it pg-restore-test psql -U postgres -c "SELECT 1;"
docker exec -it pg-restore-test psql -U postgres -c "\dt"

## 終わったら停止
docker stop pg-restore-test
  • SELECT 1; が通る → まずOK🥳
  • \dt でテーブルが出る → かなりOK🎉
  • エラーなら「復元の階層」「権限」「DBのバージョン差」あたりが犯人になりがちです🕵️‍♂️

6) 切り替え:Compose側で“使うボリューム”をスイッチする🔀🧩

ここで便利なのが、Composeの volumes: にある name: です✨ name: は「実際のボリューム名をそのまま使う」設定で、環境変数で差し替えもできます。(Docker Documentation)

例:compose.yml のボリュームを“可変”にする📛

volumes:
db-data:
name: ${DATABASE_VOLUME}

.env にこう書くと👇

DATABASE_VOLUME=myapp_db_data

復元版に切り替えるときは👇

DATABASE_VOLUME=myapp_db_data_restore_20260211

そして再起動🔁

docker compose up -d

name: は「スタック名(プロジェクト名)でスコープされず、そのままの名前を使う」仕様なので、切り替え運用と相性がいいです。(Docker Documentation)


7) ロールバック(保険)も“手順化”しよう🛟😺

切り替え後すぐ消すのは危険です⚠️ おすすめはこの運用👇

  • 切り替え当日:元ボリュームは残す(最強の保険)🛟
  • 1〜2日運用して問題なし:やっと掃除🧹

ロールバックは超簡単で、

  • .envDATABASE_VOLUME を元に戻す
  • docker compose up -d

これだけです🔁✨


復元チェックリスト✅✅✅(これだけ守れば事故が激減)

  • 対象サービスを止めた🛑
  • 復元先は“新ボリューム名”にした📦
  • tar -t... で中身を確認した👀
  • 展開時に階層がズレないようにした(必要なら --strip 1)🧩
  • 起動して動作確認した(接続・クエリ・画面操作など)🧪
  • 切り替えは Compose の name: + env で安全にやった🔀
  • 元ボリュームを即削除しない🛟

ありがちな詰まりポイント集🧩😵‍💫

--strip 1 付けたら壊れた/付けないと壊れる

バックアップの作り方次第です! 公式例でも、作り方に合わせて --strip 1 を使っています。(Docker Documentation) 困ったら「復元先ボリュームに展開したあと、ディレクトリの深さを確認」すると早いです👀

② DBが起動しない

→ よくある原因

  • DBが起動中に復元して壊れた(だから止める🛑)
  • バージョン差(同じメジャーで揃えるのが無難)
  • パスが違う(DBのデータディレクトリとマウント先)

③ “戻したのにデータが見えない”

→ だいたい 階層ズレです😂 /var/lib/postgresql/data 直下に「本体」があるべきなのに、その下にもう1段フォルダができてる…みたいなやつです📂📂


AI活用コーナー🤖🛡️(安全運用つき)

AIに聞くなら、こういうお願いが安全です👇

  • 破壊コマンド(rm、prune、down -v等)を出さないで
  • PowerShellで動く形で
  • 復元先は必ず新ボリューム名

例プロンプト(コピペ用)👇

Docker volume の tar バックアップを “別名ボリューム” に復元したいです。
条件:
- 破壊コマンドは禁止(rm, prune, down -v など出さない)
- PowerShell で動くコマンドで
- 手順は「停止→新ボリューム作成→tar展開→起動確認→切り替え」
- tar の階層ズレ対策(--strip 1 の判断)も説明して

最後に、人間の目で 「消す系が混ざってないか」 だけチェックすればかなり安全です🛡️✨


次の第17章は「バックアップ頻度と世代管理(何回分残す?どこに置く?)」なので、今回作った“復元できる手順”を前提に、運用ルールへ落としていきます📅🧠