第30章:総仕上げ:15分で回る“データ運用ルーチン”を完成させる🏁✨
この章のゴールはシンプルです👇
**「初期化 → 開発 → バックアップ → 復元テスト」**を、毎回同じ手順でサクッと回せるようにして、README.md に固定します📘🎉
(固定できると、未来の自分とチームが救われます😇)
0) まず作る“儀式セット”📦✨(成果物)
フォルダ構成イメージ👇
-
compose.yml(DBのvolumeを使う) -
init/(初期化SQLなど) -
backup/(バックアップ置き場) -
scripts/(15分儀式をワンコマンド化)health.ps1(生存確認)backup-volume.ps1(volumeをtarで固める)restore-volume.ps1(別名volumeへ復元して動作確認)reset-dev.ps1(開発用:全部捨てて最初から)
1) 15分ルーチン本体⏱️(タイムテーブル付き)🧠
⏱️ 0:00–2:00 ① 生存確認(壊す前に“今”を記録)🩺
やること👇
- コンテナが生きてる?
- volume名はどれ?
- 直近バックアップある?
(Composeのvolume定義は「トップレベル volumes:」で作れます📦)(Docker Documentation)
⏱️ 2:00–6:00 ② “書き込み停止”してからバックアップ(安全寄り)🛑🧳
volume丸ごとバックアップは強いです💪
Docker公式は tar で固める手順を案内してます。(Docker Documentation)
ポイント👇
- DBは止めてから(物理的にファイル固めるので事故率が下がる👍)
- いったん
tar.gzを作る(バックアップは“ファイル”が正義📦)
⏱️ 6:00–12:00 ③ “別名volume”に復元して、復元テスト🎭🧯
ここが本体です🔥 復元できないバックアップは、無いのと同じ😱
コツ👇
- 別名volumeへ復元(本番(=普段使い)を壊さない)
- “復元テスト用のvolume”に切り替えて起動してみる
Composeのvolumeには name: があり、実volume名を固定したり、.env から差し替えたりできます。(Docker Documentation)
⏱️ 12:00–15:00 ④ 片付け&メモ(未来の自分に手紙)🧽📝
- 復元テスト用スタックを止める
- 復元用volumeは「残す / 消す」を決める
README.mdに結果を1行追記(例:2026-02-11 restore test OK✅)
2) “切り替え可能なvolume”にしておく(Compose側)🔁📦
compose.yml のvolumeを、環境変数で差し替えできる形にしておくと復元テストが超ラクです✨
(name: は「実volume名をそのまま使い、プロジェクト名でスコープされない」動きです)(Docker Documentation)
## compose.yml(例:db-data を実volume名で固定/差し替え)
services:
db:
image: postgres:16
volumes:
- db-data:/var/lib/postgresql/data
volumes:
db-data:
name: ${DATABASE_VOLUME:-myapp_dbdata}
3) scripts(PowerShell)🧰⚙️
✅ コピペで動く“叩き台”です。AIに整形させるのはOKですが、削除系の行は必ず目視チェックしてね🛡️🤖
A) scripts/health.ps1(状況確認)🩺🔎
Write-Host "== compose ps ==" -ForegroundColor Cyan
docker compose ps
Write-Host "`n== volumes (filter) ==" -ForegroundColor Cyan
docker volume ls
Write-Host "`n== hint ==" -ForegroundColor Yellow
Write-Host "DATABASE_VOLUME env can switch actual volume name (see compose.yml)."
B) scripts/backup-volume.ps1(volume → tar.gz)🧳🗜️
Docker公式の “volumeをtarで固める” 手順の考え方に沿ってます(tar バックアップ/リストア)。(Docker Documentation)
param(
[string]$VolumeName = $env:DATABASE_VOLUME,
[string]$OutDir = (Join-Path $PSScriptRoot "..\backup")
)
if ([string]::IsNullOrWhiteSpace($VolumeName)) { $VolumeName = "myapp_dbdata" }
$stamp = Get-Date -Format "yyyyMMdd-HHmmss"
New-Item -ItemType Directory -Force -Path $OutDir | Out-Null
$archive = "$stamp-$VolumeName.tar.gz"
Write-Host "Backup volume: $VolumeName -> $OutDir\$archive" -ForegroundColor Green
## DBを止めてから実行が安全(物理バックアップ)
## 例: docker compose stop db
docker run --rm `
-v "${VolumeName}:/data" `
-v "${OutDir}:/backup" `
ubuntu `
bash -lc "tar czf /backup/$archive -C /data ."
Write-Host "Done ✅ $OutDir\$archive" -ForegroundColor Green
C) scripts/restore-volume.ps1(別名volumeへ復元 → テスト起動)🎭🧯
復元は“別名volume”に入れてから、DATABASE_VOLUME を差し替えて起動します。
name: + .env 差し替えの考え方は公式にあります。(Docker Documentation)
param(
[Parameter(Mandatory=$true)][string]$ArchiveFile, # 例: 20260211-120000-myapp_dbdata.tar.gz
[string]$BaseVolumeName = $env:DATABASE_VOLUME,
[string]$BackupDir = (Join-Path $PSScriptRoot "..\backup")
)
if ([string]::IsNullOrWhiteSpace($BaseVolumeName)) { $BaseVolumeName = "myapp_dbdata" }
$full = Join-Path $BackupDir $ArchiveFile
if (!(Test-Path $full)) { throw "Backup not found: $full" }
$restoreVol = "${BaseVolumeName}_restore_test"
Write-Host "Create restore volume: $restoreVol" -ForegroundColor Cyan
docker volume create $restoreVol | Out-Null
Write-Host "Restore: $full -> $restoreVol" -ForegroundColor Green
docker run --rm `
-v "${restoreVol}:/data" `
-v "${BackupDir}:/backup" `
ubuntu `
bash -lc "tar xzf /backup/$ArchiveFile -C /data"
Write-Host "`n== Next ==" -ForegroundColor Yellow
Write-Host "1) Start stack with DATABASE_VOLUME=$restoreVol"
Write-Host " `$env:DATABASE_VOLUME='$restoreVol'; docker compose up -d"
Write-Host "2) Run a quick smoke test (API / login / migration check etc.)"
Write-Host "3) Stop it: docker compose down"
D) scripts/reset-dev.ps1(開発用:初期化からやり直し💣➡️🌱)
Postgresの初期化スクリプトは データディレクトリが空のときだけ走ります。だから「やり直し」は volumeを消すのが最短です🪤(hub.docker.com)
Write-Host "This will REMOVE volumes used by compose. Are you sure? 😈" -ForegroundColor Yellow
Write-Host "(Ctrl+C to cancel)" -ForegroundColor Yellow
Start-Sleep -Seconds 3
docker compose down -v
Write-Host "Reset done ✅ Next: docker compose up -d" -ForegroundColor Green
4) README.md に貼る「データ運用:これだけ」テンプレ📘✨
## データ運用(15分ルーチン)⏱️📦
## 1) 生存確認 🩺
- `.\scripts\health.ps1`
## 2) バックアップ 🧳
- できれば先にDB停止: `docker compose stop db`
- `.\scripts\backup-volume.ps1`
- DB再開: `docker compose start db`
## 3) 復元テスト 🎭
- `.\scripts\restore-volume.ps1 -ArchiveFile "<backup file>"`
- 指示に従って `DATABASE_VOLUME` を復元用に差し替えて `docker compose up -d`
- アプリの軽い動作確認(ログイン/一覧表示/1件作成など)
- `docker compose down`
## 4) 記録 📝
- restore test: OK / NG
- 気づき(1行でOK)
5) “最後の保険”🧰:Docker Desktopを丸ごとバックアップ(緊急用)🆘
普段は **プロジェクト単位のバックアップ(volume/ダンプ)**が基本だけど、 「Docker Desktopが起動しない😇」みたいな事故では VMディスクを退避する手が使えます。公式にWindowsの退避パスも載ってます。(Docker Documentation)
それと大事な注意👇
イメージ保存(docker image save)だけでは、volumeの中身は含まれません(別でバックアップが必要)という案内もあります。(Docker Documentation)
6) AIの使いどころ🤖✨(危険にしないコツ🛡️)
おすすめの投げ方👇(コピペ用)
- 「この
backup-volume.ps1、削除系コマンドが無いかチェックして、危ない行があったら指摘して」 - 「
restore-volume.ps1を、復元先volume名を日付付きにするように直して」 - 「このcompose構成で、復元テスト用に ポート競合しない起動方法を3案ちょうだい」
⚠️ ただし:.env / APIキー / パスワードは貼らない🔒(ここだけは徹底!)
7) おまけ:Windowsで“重い”ときの小ワザ🐢➡️🐇
データ運用そのものじゃないけど、開発が遅いと儀式が続かないので…🤣 VS Code公式でも、Windowsでは WSL2側のファイルシステムに置くとディスク性能が良くなりやすい方向性が案内されています。(Visual Studio Code)
必要なら、あなたの実プロジェクトの **compose.yml(DB部分だけでOK)**を貼ってくれたら、 この第30章のスクリプトを **“その構成にぴったり版”**に寄せて、コピペで完成する形に整えます🔥📦🤖