本文へスキップ
BecomeCoder

Dockerコース · 第6章 データを残す · レッスン20

-v でマウントする ― コンテナに保管庫をつなぐ

ブラウザで完結

導入

保管庫(ボリューム)を作っただけでは、まだデータは守られません。コンテナ起動時に「このボリュームを、コンテナ内のこのフォルダに割り当てる」とつなぐ(マウントする)必要があります。使うのは 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 が(作っていなくても)できていることが分かります。

実際に動かしてみよう

下の端末に docker コマンドを打って Enter を押すと、その場で結果が返ります。本文の手順を実際になぞりながら進めましょう(各レッスンは毎回まっさらな状態から始まり、「最初からやり直す」でいつでも戻せます)。

Docker(シミュレート)

ブラウザ内で docker コマンドを試せる学習用環境を読み込みます(本物のDockerではなく、動きを再現したものです)。
スクロールして表示された時点でも自動で読み込まれます。