インフラ作業支援ラボInfra Support Lab ← ガイド一覧← 戻る

Docker Volumeの確認・バックアップ・復元手順|bind mountとの違い

Dockerのコンテナ更新・移行・削除の前に、データがどこに保存されているか、バックアップと復元が成立するかを確認する運用ガイドです。特に名前付きVolumeとbind mount、コンテナの書き込み可能レイヤーを混同しないようにします。

この記事の目的

コンテナの削除で残るデータ・失われるデータを区別し、検証用Volumeで安全なバックアップ・リストア手順を学びます。

まず確認すること

docker context show→docker volume ls→docker inspect --format '{{json .Mounts}}'で接続先とマウントを確認。

本番作業前:停止・削除・復元は実データを書き換えます。オンラインのDBを単純にtarで保存しても整合性を保証できません。 web01・app-data・ポート番号などは説明用です。Docker context・対象コンテナ・データ保存先を照合してください。

1. Volume・bind mount・書き込み可能レイヤーの違い

保存場所コンテナ削除後用途・注意
名前付きVolume通常はデータが残るDockerが管理する永続データ。使用元と削除条件を把握
bind mountホスト上の実ファイルは残るホストのパス・所有者・権限・SELinux設定に依存
コンテナの書き込み可能レイヤーコンテナ削除で失われるコンテナを再作成したときに残ると期待しない
tmpfs停止や再起動などで失われる一時データ用。永続バックアップ先ではない

Docker公式はVolumeをコンテナのライフサイクルとは独立した永続保存として位置付けています。バックアップ対象はコンテナ名だけでなくマウント先から特定します。

2. データ保存先を変更前に確認

# 参照のみ:実際に操作するDocker Engineを特定 docker context show docker volume ls docker volume inspect app-data # コンテナのマウント定義(個人情報・パスを含むことがある) docker inspect --format '{{json .Mounts}}' web01 # Docker管理データの概算容量 docker system df -v

app-data・web01は説明用です。docker volume inspectにはMountpointが出ますが、Volumeの内部ファイルをホストから直接変更しないでください。rootlessやDocker Desktopではデータの実配置が異なることがあります。

3. 稼働中データの整合性と復元可否

アーカイブ作成成功、ファイルとしての読取り成功、アプリケーションとしての復元成功は別の判定です。書き込みが続いているVolumeのtar取得だけで整合性は保証されません。 ホストファイル、DB、キューや複数Volumeを同時に扱うアプリで手順を分けてください。

データ取得前の条件復旧確認
静的ファイル・検証用Volume書き込み停止を確認し、対象パス・アクセス権・容量を記録別Volumeへ展開し、ファイルと権限・アプリからの読取りを確認
DB・トランザクションを伴うアプリDB製品のオンラインバックアップ/整合性スナップショット等、製品固有の推奨手順を優先。単純tarを代用しない隔離環境への復元、起動、整合性チェックとアプリ機能確認まで実施
複数Volume・外部ストレージ取得時点をそろえる仕組みと依存関係を確認データ間の整合性とサービス全体の復元順序を確認
# 参照のみ:実行対象とマウント docker context show docker volume inspect app-data docker inspect --format '{{json .Mounts}}' web01 # 既に作成した検証用アーカイブの読取りチェック tar -tzf "$BACKUP_DIR/app-data.tar.gz" > /dev/null sha256sum "$BACKUP_DIR/app-data.tar.gz"

ハッシュ値はアーカイブの同一性確認には役立ちますが、アプリケーションのデータ整合性を証明しません。復元検証に失敗した場合は本番Volumeを上書きせず、原因を調査してバックアップ方式を見直してください。空の検証用Volumeへ復元する手順と、本番への復元手順を混同しないことが重要です。

4. 検証環境でVolumeをバックアップする

バックアップを取る瞬間にデータを書き換えているアプリがあると、アーカイブの整合性が崩れる場合があります。DBはまずアプリ固有のバックアップ機構や静止化・スナップショットの方法を確認してください。次は整合性が確保された検証用Volumeだけを対象とした一例です。この例のbind mountはdaemonホスト側のパスを参照します。リモートcontextではCLI端末のカレントディレクトリと一致しないため、そのまま実行しないでください。

# 同じLinux daemonホストで対象Volumeを事前確認 pwd -P docker context show docker volume inspect app-data # 新しい専用ディレクトリを作成(既存なら失敗) BACKUP_DIR="$(pwd -P)/docker-backup-$(date +%Y%m%d-%H%M%S)" mkdir -m 700 "$BACKUP_DIR" # mkdir成功と保存容量を確認後にのみ実行 docker run --rm \ --mount type=volume,src=app-data,dst=/data,readonly \ --mount type=bind,src="$BACKUP_DIR",dst=/backup \ busybox:1.37 sh -c 'tar -C /data -czf /backup/app-data.tar.gz .'
注意:この例はbusybox:1.37を取得・起動します。イメージ取得元、保存先への上書き、持ち出すデータの機密区分を確認してください。取得中のアプリ書き込みを止められない場合は別方式を選びます。Volumeの存在確認、専用ディレクトリの作成、空き容量確認のいずれかが失敗した場合はバックアップ用コンテナを起動せず、保存先と対象を再確認してください。

5. 別Volumeへのリストアを検証

復元の確認は、いきなり本番Volumeへ上書きせず、新しい検証用Volumeを作って行います。アーカイブの出所・内容を確認し、絶対パスや意図しないファイルを展開しないことを確かめてください。

# 作成時に記録したBACKUP_DIRを同一シェルで使用(別シェルなら再設定) test -f "$BACKUP_DIR/app-data.tar.gz" # 参照のみ:アーカイブ一覧を先に見る tar -tzf "$BACKUP_DIR/app-data.tar.gz" | head -n 30 # 検証用の新規Volume作成(状態変更) docker volume create app-data-restore # 承認後:検証用Volumeに展開(書き込み・上書きが発生) docker run --rm \ --mount type=volume,src=app-data-restore,dst=/data \ --mount type=bind,src="$BACKUP_DIR",dst=/backup,readonly \ busybox:1.37 sh -c 'tar -C /data -xzf /backup/app-data.tar.gz'

復元前の停止条件:BACKUP_DIR未設定、アーカイブ不在・破損、または同名の検証用Volumeが既に存在するときは復元しないでください。docker volume createは既存名でも失敗しないため、docker volume inspect app-data-restoreで事前に存在を調べ、新規の未使用名で作業します。

復元後はファイル件数や所有者だけでなく、アプリを別環境で起動して読み込み・書き込みが正常か確認してください。アーカイブ内のパス・権限・シンボリックリンクが信頼できるものかも監査対象です。

6. 削除時のデータ保持・消失条件

操作確認すべき影響
docker rmコンテナ本体を削除。Volumeの扱いと書き込み可能レイヤーを区別
docker rm -v匿名Volumeが削除対象になる場合がある。名前付きVolumeとは区別
docker compose downComposeコンテナ・ネットワークを削除。既定では名前付きVolumeは保持
docker compose down -vCompose定義の名前付きVolume等も削除対象となる
docker volume prune既定では未使用の匿名Volumeが対象。--allを付けると未使用の名前付きVolumeも対象
危険操作:「コンテナを消すだけ」と考えてdown -vやvolume pruneを実行しないでください。復元手順とバックアップの実効性を確認してから削除判断します。

7. 本番変更前のチェックリスト

コンテナ起動後の保存先が変わる場合はCompose設定確認、容量問題が起きている場合はLinux容量不足の切り分けも参照してください。

8. バックアップ・復元の合否を確認する

アーカイブ作成の成功と、アプリの復旧成功は異なります。バックアップ時に静止化・アプリ固有の整合性確保を実施したかを確認したうえで、別Volumeへ復元したデータを検査します。以下は検証専用の想定例であり、実機実測ではありません。

# 参照:アーカイブ読込み検査とハッシュ tar -tzf "$BACKUP_DIR/app-data.tar.gz" > /dev/null sha256sum "$BACKUP_DIR/app-data.tar.gz" # 既に検証用として作成したVolumeを読み取りで確認 docker run --rm --mount type=volume,src=app-data-restore,dst=/data,readonly busybox:1.37 sh -c 'ls -lan /data; find /data -maxdepth 2 -type f | head -n 20'
# 出力例(想定・実測ではありません) $ tar -tzf "$BACKUP_DIR/app-data.tar.gz" > /dev/null $ echo $? 0 # tarが読めることとDBの整合性は別
検証結果次の行動
アーカイブ読込み成功・取得時のchecksumと一致ファイル破損は検出されなかった。次に内容・所有者・パーミッション・アプリからの読込みを確認
tarエラー・checksum不一致本番復元を中止。バックアップ元と転送過程を調べ、正常なバックアップを再取得
復元後のファイル欠落・UID/GID違い展開方法・マウント先・実行ユーザーを確認して検証用Volumeで再試験
ファイルは存在するがDB・アプリが異常データ整合性・DBバージョン・論理バックアップ/スナップショット・マイグレーションを担当者と確認
別環境のアプリがデータを読め、業務機能が正常手順・所要時間・復元点・旧Volumeの保持方法を記録し、検証合格
対象の信頼性:出所不明のtarを本番ボリュームに展開しないでください。アーカイブ内のパス・シンボリックリンク・権限も信頼できる検証環境で調べます。

9. 本番移行で失敗した場合の切り戻し

本番移行は元のVolumeを保持した状態で、別Volumeへの復元とアプリ動作検証を先に実施する方式が安全です。復元先で書込みが進んだ後は、旧版のデータ形式へ単純に戻せない場合があります。

状況切り戻しの判断
元Volumeを保持・新Volumeの起動試験が失敗承認された旧Compose定義・イメージ・元Volumeへの接続へ戻し、旧アプリからの読込みを再確認
データベースのマイグレーションを実行済みVolume切替で戻せるとは限らない。DB管理者とスキーマ互換性・逆マイグレーション・バックアップ復元を確認
意図しないVolumeを使っているComposeプロジェクト接頭辞とexternal指定・mount先を確認し、削除する前に実利用先を記録
バックアップは存在するが復元を未検証本番更新を保留し、隔離した検証Volumeでアプリの復元試験を実施
データ保護:本番データが残る場所に対してdocker compose down -vやdocker volume prune --allを復旧目的で実行しないでください。復旧成功の基準はアーカイブ作成ではなく、実アプリの必要データと業務動作の確認です。

公式・一次資料

対象と実行前チェックを継続する

読み取り操作、設定変更、削除操作を分け、作業後の状態と業務影響を確認します。

柱ガイドへ戻る