Skip to main content

第15章:まずは公式ど真ん中:volumeをtarでバックアップする🧳

この章は「Dockerのvolumeを“箱詰め”して、1ファイル(.tar/.tar.gz)にする」回です📦✨ できあがる成果物はこれ👇

  • backup/ フォルダ
  • (volume名)_yyyymmdd_HHmm.tar.gz みたいなバックアップファイル🗜️

1) まずイメージ:volumeバックアップ=“段ボールに全部詰める”📦

Dockerのvolumeは、コンテナが消えても残る「データ置き場」🧺 だから 丸ごと固めて移動しやすいのが強みです💪 (公式も「volumeはbind mountよりバックアップ/移動がしやすい」って立場です)(Docker Documentation)


2) 最重要⚠️:DBのvolumeをtarで固めるときの注意点🐘🧯

たとえばPostgresのデータ(/var/lib/postgresql/data)みたいに、動きながら書き換わるデータを「ファイル丸ごとコピー」すると、タイミング次第で整合性が崩れることがあります😇💥

  • いちばん安全:DBコンテナを止めてからバックアップ(短時間でOK)🛑
  • 止められない:DBの“バックアップ機能”を使う(例:Postgresなら pg_basebackup など)🧠

PostgreSQL公式も、ファイルシステムレベルのバックアップで整合性を取る話(止める/ベースバックアップ等)を説明しています(PostgreSQL)

この教材ロードマップでは前章で「ダンプ型」も扱ってるので、本番相当ならダンプ/DB専用手段が優先、この章は「volume丸ごと型」をまず手で覚える回📘✨


3) 対象volumeを特定する🔎(ここで迷う人が多い!)

まず「バックアップしたいvolume名」を確定させます✅

docker volume ls

Composeのプロジェクトだと、(プロジェクト名)_(ボリューム名) みたいにprefix付きで出ることが多いです👀 見つけたら、念のため中身(マウントポイント等)を確認:

docker volume inspect <volume名>

4) 実行:tarで固める🗜️(公式ルートを2本用意するよ✌️)

公式の考え方は「一時コンテナを起動して、そこからtarを作る」です🎬 公式例は --volumes-from で“あるコンテナのvolume”を引き継いでtarしています(Docker Documentation)

ここでは、現場で使いやすい順に2パターンを紹介します👇


✅ 4-A) 公式そのまま:--volumes-from 方式(コンテナ名ベース)🧳

コンテナ名が分かってるときに強いです💪 (公式はこの形で backup.tar を作っています)(Docker Documentation)

まず、コンテナ名を確認:

docker ps

そしてバックアップ:

mkdir backup -Force

docker run --rm --volumes-from <対象コンテナ名> `
-v "${PWD}:/backup" `
ubuntu tar cvf /backup/backup.tar <コンテナ内のバックアップしたいパス>
  • --rm:終わったら一時コンテナを自動で消してくれる🧼
  • -v "${PWD}:/backup":手元のフォルダにファイルが落ちる📥(これ超大事)

ただしこの方式は「コンテナ内のどのパスをtarるか」を間違えると事故るので、慣れないうちは次の方式がラクです😊


✅ 4-B) おすすめ:volume名を直接マウントして固める(分かりやすい)🧠✨

Dockerは、volumeを --mount type=volume または -v <volume名>:<パス> でマウントできます(Docker Documentation) なので「volume名が分かってる」なら、こっちがシンプルです🎉

**PowerShell版(おすすめ)**👇

$VOL   = "<volume名>"
$STAMP = Get-Date -Format "yyyyMMdd_HHmm"
mkdir backup -Force

docker run --rm `
--mount "type=volume,src=$VOL,target=/data" `
--mount "type=bind,src=$($PWD.Path),target=/backup" `
ubuntu bash -lc "cd /data && tar czf /backup/${VOL}_$STAMP.tar.gz ."

ポイント💡

  • --mount は「何をどこに付けるか」が読みやすいので事故りにくい🙆‍♂️ (公式も --mount を“より明示的で推奨寄り”として説明してます)(Docker Documentation)
  • cd /data && tar ... . にすることで、展開時に余計なパスが付きにくい(次章が楽)🧯

5) Windowsでの“保存先フォルダ”の注意🪟⚠️

バックアップファイルは「手元(ホスト側)」に出したいので、bind mountbackup/ を渡します📁 bind mountの基本構文(host-path:container-path)は公式が説明してます(Docker Documentation)

Docker Desktopは内部的にLinux VM上で動きますが、ホストのパス共有はよしなにやってくれます(Docker Documentation) なので、上の PowerShell 例みたいに src=$($PWD.Path) が素直に動きやすいです😊


6) できたか確認✅(“作れたつもり”を潰す)

**① ファイルがある?**📦

Get-ChildItem .\backup

**② 中身が空じゃない?**👀 (tarを読む用の一時コンテナで確認すると、Windows側にtarが無くてもOK✨)

$FILE = "backup\<作ったファイル名>.tar.gz"
docker run --rm -v "${PWD}:/backup" ubuntu bash -lc "tar tzf /backup/$($FILE -replace '\\','/') | head"

③ ハッシュを取る(改ざん/転送ミス検出)🔐

Get-FileHash .\backup\<作ったファイル名>.tar.gz -Algorithm SHA256

7) よくあるコケ方🫠➡️🧯

  • backupフォルダに何も出てこない 👉 --mount type=bind,src=...,target=/backup が効いてない可能性大(パス指定ミス) bind mountは「ホスト側のパスをコンテナに付ける」ものです(Docker Documentation)

  • volume名が違う 👉 docker volume ls で“本当に存在する名前”をコピペするのが最強🔎

  • DBが動いたままtarってしまった 👉 復元したときに壊れてる可能性があるので、次回から“止める/DB専用”に寄せよう🐘 (Postgresはファイルシステムバックアップの整合性の話が公式にあります)(PostgreSQL)


8) AI活用(安全運転)🤖🛡️

Copilot / Codex にはこう頼むと早いです💨

  • 「PowerShellで、volume名と保存先を変数にして、tar.gzを日付付きで作るスクリプト作って」
  • 「復元(次章)で事故らないように、tarの作り方を cd /data && tar ... . にして」

ただし⚠️ “削除系(rm / prune / down -v)”が混ざってないかは必ず目視チェックね👀💣


この章のチェックリスト✅✅✅

  • バックアップ対象のvolume名を確定した🔎
  • backup/(volume名)_yyyymmdd_HHmm.tar.gz ができた🧳
  • tarの中身を一覧して「空じゃない」を確認した👀
  • SHA256を取った🔐

次の第16章では、このtarを別volumeに戻して、動作確認して、切り替えるところまでやります😱➡️😎