広告・アフィリエイトリンクは掲載していません。

Dockerの作業フォルダをコピーしたのに復元できない理由:VolumeとBind Mountの保存範囲

docker-compose.ymlがあるフォルダを丸ごとバックアップしたのに、別マシンへ移したらデータベースの中身が空になっていた。名前付きVolumeとBind Mountの保存場所の違いを整理します。

先に、選び方の要点

  • Dockerのデータ永続化には「Volumes(Docker管理領域に保存)」と「Bind mounts(ホストの任意パスを共有)」があり、作業フォルダのコピーだけで移せるのはカレントディレクトリ配下のBind mountのみである。
  • docker-compose.ymlで `db_data:/var/lib/postgresql/data` のように名前付きVolumeを使っている場合、実データはDocker管理領域(`/var/lib/docker/volumes/` 等)にあるためプロジェクトフォルダをコピーしても含まれない。
  • 稼働中のデータベースファイルを生のままコピーすると破損するリスクがあるため、DBは公式のダンプ出力(pg_dump等)を保存し、静的ファイルと一緒に退避させる。

選択肢を並べる

表が画面に収まらない場合は、横にスクロールして読めます。

2026年10月16日確認のDocker公式ドキュメント(Volumes / Bind mounts)に基づく整理。
マウント方式(記述例)ホスト上の実際の保存場所作業フォルダのコピーに含まれるかバックアップ時の注意点
相対パスのBind mount(./data:/app/data)作業フォルダ直下の ./data ディレクトリ含まれる権限(UID/GID)や稼働中DBの書き込み競合に注意
絶対パスのBind mount(/mnt/nas/photos:/photos)指定した外部パス(/mnt/nas/photos)作業フォルダには含まれない(別パス)マウント先ドライブも含めてバックアップ対象に指定する
名前付きVolume(db_data:/var/lib/postgresql/data)Docker Engine管理領域(/var/lib/docker/volumes/等)含まれない(最も見落としやすい)docker volume用の退避手順またはDBダンプ出力が必要
比較表をCSVで保存

docker-compose.ymlがあるフォルダをコピーしても名前付きVolumeは付いてこない

ミニPCの買い替えやサーバー移行の際、`docker-compose.yml` が置かれている作業フォルダを丸ごと圧縮して新しいマシンへコピーしたのに、起動すると初期状態(データが空)に戻ってしまうトラブルがよく起きます。原因の多くは、`volumes:` 欄の書き方の違いにあります。`./config:/config` のように `./` や `/` から始まるパスを指定した場合は「Bind mount(バインドマウント)」となり、そのフォルダ内にファイルが保存されます。一方、`db_data:/var/lib/mysql` のようにパスではなく名前だけを指定した場合は「名前付きVolume(Named Volume)」となり、実データは作業フォルダの外にあるDocker専用の管理ディレクトリ内に保存されるため、作業フォルダだけをコピーしてもデータは1バイトも含まれません。

参照: Docker Docs:Volumes Docker Docs:Bind mounts

ホスト側のファイルを直接書き換えられるBind mountの特徴とリスク

Docker公式ドキュメント(Bind mounts)で説明されている通り、Bind mountはホストマシン上のファイルやディレクトリをそのままコンテナ内へマウントする仕組みです。ホスト側のバックアップツールから直接ファイルを見られるため個人サーバーでは管理しやすい反面、コンテナ内のプロセスからもホスト上のファイルを作成・変更・削除できる(既定で書き込み可能)という特徴があります。設定ファイルなどコンテナ側から書き換える必要がないものは `:ro`(読み取り専用)を付けてマウントすることで、意図しない上書きや破損を防げます。

参照: Docker Docs:Bind mounts

データベースの保存領域は稼働中にそのままファイルコピーしない

ではすべてを `./db:/var/lib/postgresql/data` のようなBind mountに統一して毎日フォルダごとコピーすれば安全かというと、データベースに関しては別の注意が必要です。PostgreSQLやMySQL、SQLiteなどが稼働して書き込みを行っている最中に外からデータファイルを直接コピーすると、メモリ上の未反映データとディスク上のファイルが食い違い、復元時にデータベースが破損して起動しなくなることがあります。Immichの公式バックアップドキュメントでも、写真ファイル本体はフォルダコピーで保護しつつ、データベースについては専用の作成ジョブ(DBダンプ出力)を使って整合性の取れたダンプファイルを作成・保存する手順が採られています。

参照: Docker Docs:Volumes Immich Docs:Backup and Restore

移行前に docker compose config と volume 一覧で保存先を棚卸しする

自宅サーバーのバックアップを設定する際は、まず各コンテナの `docker-compose.yml` と `.env` ファイルを見直し、どのデータが「相対パスのBind mount」「別ドライブの絶対パス」「名前付きVolume」のどれに入っているかを書き出します。その上で、一度別ディレクトリやテスト環境でバックアップファイルだけからコンテナを起動し、ログイン情報や過去データが本当に復元できるかを試しておくことが最も確実な保険になります。

参照: Docker Docs:Volumes Docker Docs:Bind mounts Immich Docs:Backup and Restore

参考資料とこの記事の範囲

2026年10月16日にDocker公式ドキュメント(Volumes、Bind mounts)およびImmich公式バックアップガイドを確認して整理した記事です。

  • Docker Docs:Volumes確認日: 2026-10-16 / Dockerが管理するVolumeの仕組み、Bind mountとの違い、保存領域とバックアップの基本概念。
  • Docker Docs:Bind mounts確認日: 2026-10-16 / ホスト側パスをコンテナへ共有する仕組み、既定の書き込み権限と読み取り専用設定。
  • Immich Docs:Backup and Restore確認日: 2026-10-16 / Docker環境における実ファイル領域(UPLOAD_LOCATION)とデータベースダンプを分けて保護する具体例。

次に考えたいこと