目次 — 知りたいところから読む

入力を変えて確かめる

実験パネルを開き、実行を押すとPythonを読み込みます。停止と初期値へのリセットができます。結果はこの端末内で計算します。Pythonのインストールは不要です。

下にあるローカル実行の手順は、配布ソースを再現するための任意の手順です。ブラウザ実験には不要です。

実験パネルを別タブで開く

再現用ソースをダウンロード

前提と読み方

前提知識 Dockerのrunとコンテナの基本。Linuxコンテナを想定する。

実装・実験 · 本文の条件と確認項目に沿って、計算例や比較表を追う。

ブラウザで保存先の寿命を確かめる

上のパネルは、保存領域の所有者とコンテナの接続を状態図で表します。Dockerの実行や実ファイルへのアクセスは行いません。 保存先と操作を変え、段階ごとの図・表を比較してください。下のDockerコマンドは、別途実環境で確かめたい場合の手順です。

毎回、同じ準備済み状態から始めます。選択した保存先の /data/note.txt に saved、コンテナの書込層の /tmp/note.txt に temporary がある状態です。イメージの /data は空で、アプリ起動時にもファイルは作りません。mountの読取専用設定は準備後に適用します。最後に別ファイル /data/probe.txt の作成を試みます。この新しい印は元のnoteを復元しません。

named volumeは既定のproject名付き alpha_data、external volumeは用意済みの固定名 shared_data、bind mountはdaemonホスト上の固定絶対パス /srv/demo-data を使います。後二つはproject変更後も同じ保存先です。volumeの独自の name、anonymous volume、tmpfs、driver設定、イメージから空volumeへの初期コピー、読取専用以外の権限、別コンテナとの共有は扱いません。

「project変更」はalphaをvolume削除なしでdownし、betaを起動する操作です。「alphaへ戻る」はさらにbetaをdownしてalphaを起動します。空の beta_data へ接続すると、alpha_data のnoteが残っていても読めなくなります。図では「残存」と「現在の接続から読める」を分けます。読取専用はmountにだけ適用し、書込層を選んだ場合は無視します。

書込層の再起動と再作成、named volumeのdownとdown --volumes、project変更と復帰、削除操作でのnamed/externalの違いを比較してください。削除のシナリオには再起動までを含みます。指標は1が「はい」、0が「いいえ」という結果で、確率や復旧保証ではありません。

規則は2026-09-20に Dockerの保存領域、volume、bind mount、Compose down、volume名とexternalで確認しました。実Engineとの実行照合ではなく、資料に基づく状態モデルです。ホスト故障やアプリ・DBの整合性は扱いません。復元Labで、保存とは別の復元確認へ進めます。

コンテナは作り直せても、データが自動的に戻るとは限らない。保存先の種類と、削除する対象の境界を理解する必要がある。本記事はDocker公式資料を確認した演習手順であり、本番のコンテナやボリュームで実験を実施したものではない。確認日は2026-09-07。

三つの保存場所

保存先 管理する境界 コンテナを削除した後
書込層 そのコンテナ その層の変更は失われる
named volume Dockerの独立した保存領域 volumeを削除しなければ残る
bind mount Dockerホストの指定パス ホスト側のファイルとして残る

単なるコンテナの停止・再起動と、削除して再作成することは違う。Volumesで寿命を確認できる。anonymous volumeは名前を自分で指定しない形式で、--rmなどによる削除条件がnamed volumeと異なるため、この演習では使わない。

図1 · ボタンで表示を切り替え
Dockerの保存先と復元の境界

演習用のnamed volumeを作る

Docker Engine、Linuxコンテナ、alpine:3.21を使う例である。Dockerのバージョンと実際に取得したイメージのダイジェストを記録する。タグは将来同じ内容とは限らない。duskcoil-lifetime-demoという名前が未使用であることをdocker volume lsで確認してから実行する。

docker volume create duskcoil-lifetime-demo
docker run --rm --mount type=volume,source=duskcoil-lifetime-demo,target=/data alpine:3.21 sh -c 'echo saved > /data/note.txt; echo temporary > /tmp/note.txt'
docker run --rm --mount type=volume,source=duskcoil-lifetime-demo,target=/data,readonly alpine:3.21 sh -c 'cat /data/note.txt; test ! -e /tmp/note.txt'

期待結果は/data/note.txtからsavedを読めて、2個目のコンテナの/tmp/note.txtは存在しないこと。最初の--rmでコンテナを削除してもnamed volumeは残る。2個目は読み取り専用で接続する。既存のサービス名や本番データへ置き換えて試す演習ではない。

bind mountはホストのどこを指すか

Bind mountsでは、パスはDocker daemonが動くホスト側を指す。リモートのDockerを操作している場合、手元のPCのファイルとは限らない。Docker DesktopでもVMとの境界を意識する。

docker inspect <コンテナ名>のMountsでType、Source、Destination、RWを確認する。見えている/dataが想定したディレクトリと違えば、アプリの設定を直す前に接続を直す。既存ファイルがあるディレクトリへマウントすると、その下のファイルが見えなくなることもある。「消えた」と「別のものが上に見えている」を区別する。

Composeの削除操作を読み分ける

docker compose downとdocker compose down --volumesは同じではない。後者はComposeで定義したnamed volumeなども削除対象にする。external volumeは別管理である。downの公式リファレンスで対象を確認する。

また、Composeのプロジェクト名を変えると、別の名前のvolumeが作られて初期状態に見えることがある。古いデータが壊れたと判断する前に、実際のvolume名を調べる。演習で作ったvolumeの後片付けは、内容が不要と確認した後にその名前だけを指定して行う。全volumeを対象にした一括削除は手順に含めない。

永続化はバックアップではない

volumeはコンテナの寿命からデータを分けるが、同じディスクの故障やアプリによる誤削除から守るとは限らない。別の保存先へのコピーと復元確認が必要である。データベースを動かしたままファイルをコピーすると整合しない場合があるため、アプリのバックアップ機能や停止・スナップショット条件を確認する。

イメージやComposeだけを保存しても、利用者の投稿やDBが戻るとは限らない。逆にDBだけあっても、必要な設定、鍵、バージョンがなければ復元できないことがある。復元先でアプリが読めるかを確認して初めて、保存の手順が具体的になる。

自分のサービスで作る台帳

各サービスについて「コンテナ内の保存先/Mountsの実体/所有者と権限/バックアップ方法/復元先/最後に復元を試した日」を記録する。まずこの台帳で保存先を確認し、自宅サーバーの復元演習へ進むと、失うと困るものを漏らしにくい。

現在の項目 · 1 / 3 · 雑記

次に読む

保存先が分かったら、別の場所へ復元して確認する。自宅サーバーのバックアップから復元まで — 小さなデータで復元演習する同じ分野を別の観点から読む自宅サーバーの消費電力を測る