導入
保管庫(ボリューム)を作っただけでは、まだデータは守られません。コンテナ起動時に「このボリュームを、コンテナ内のこのフォルダに割り当てる」とつなぐ(マウントする)必要があります。使うのは docker run の -v オプションです。
説明
-v <ボリューム名>:<コンテナ内のパス> と書くと、コンテナ内の指定フォルダへの読み書きが、そのままボリュームに保存されるようになります。
flowchart LR
subgraph C["コンテナ db"]
P["/var/lib/postgresql/data<br/>(DBがデータを書く場所)"]
end
P -->|"-v dbdata:/var/lib/postgresql/data"| V[("ボリューム dbdata<br/>コンテナの外")]
PostgreSQL は /var/lib/postgresql/data にデータを書きます。そこをボリュームにつなげば、DB の中身はコンテナ層ではなくボリュームに保存されます。
docker run -d -v dbdata:/var/lib/postgresql/data --name db postgres:16
これで、docker rm -f db でコンテナを消しても データは dbdata に残ります。同じボリュームを指定して新しいコンテナを起動すれば、続きから使えます。
flowchart LR
A["db を -v dbdata で起動<br/>データを書き込む"] --> B["docker rm -f db<br/>コンテナは消える"]
B --> C["新しい db を<br/>同じ -v dbdata で起動"]
C --> D["✅ 前のデータが<br/>そのまま使える"]
本当につながっているかは docker inspect で確認できます。"Mounts" の欄に、ボリュームとマウント先が出ます。
docker inspect db
"Type": "volume", "Source": "dbdata", "Destination": "/var/lib/postgresql/data" のように表示されれば、正しくマウントされています。レッスン18で空だった Mounts が、今度は埋まっているのが対比できます。
-vを書いたとき、指定した名前のボリュームがまだ無ければ、Docker が自動で作ってくれます。だから毎回docker volume createを先に打つ必要はありません。ただ「どんな保管庫を使っているか」を意識するために、明示的に作る習慣も役立ちます。
やってみよう
docker run -d -v dbdata:/var/lib/postgresql/data --name db postgres:16を実行し、docker inspect dbの"Mounts"にボリュームが出ることを確認しましょう。docker volume lsを見ると、-vで指定したdbdataが(作っていなくても)できていることが分かります。