第16章:リストア手順:戻せないバックアップは“無い”のと同じ😱
この章はズバリ、「バックアップから“ちゃんと戻せる手順”を、誰でも再現できる形にする」回です💪📦 バックアップがあっても、戻せなかったら実質ゼロですからね…🥶
この章のゴール🎯
- 別名のボリュームに復元できる(元データを壊さない)🧯
- 復元後に動作確認できる(DBなら接続&簡単なクエリ)✅
- 安全に切り替えできる(Composeの設定でスイッチ)🔁
まず結論:リストアはこの順番が最強🧠✨
- 復元先は“新しいボリューム”(別名)を作る📦
- そこへ tar を展開して復元する🗜️➡️📂
- 起動して動作確認する🧪
- OKなら そっちに切り替える🔀
- 元のボリュームは しばらく残して保険🛟
この考え方は、公式ドキュメントでも「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日運用して問題なし:やっと掃除🧹
ロールバックは超簡単で、
.envのDATABASE_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章は「バックアップ頻度と世代管理(何回分残す?どこに置く?)」なので、今回作った“復元できる手順”を前提に、運用ルールへ落としていきます📅🧠