本文へスキップ
BecomeCoder

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

コンテナは使い捨て ― なぜデータが消えるのか

ブラウザで完結

導入

コンテナの中に書き込んだファイル(データベースの中身、アップロードされた画像、ログなど)は、そのコンテナと運命を共にします。コンテナを docker rm で消すと、中のデータもまるごと消えます。まずはこの「使い捨て」の性質を、しっかり頭に入れましょう。

説明

イメージは「読み取り専用の設計図」でした(第1章)。コンテナを起動すると、その上に 書き込み用の薄い層(コンテナ層) が1枚かぶさり、実行中の変更はすべてこの層に書かれます。

flowchart TD
    subgraph C["コンテナ db"]
      W["書き込み層(コンテナ層)<br/>★ここに書いたデータは<br/>コンテナと一緒に消える"]
      I["イメージ層(読み取り専用)<br/>postgres:16"]
      W --- I
    end

ポイントは、この書き込み層が コンテナ専用で、コンテナを消すと一緒に捨てられる こと。つまり——

flowchart LR
    A["docker run<br/>DBにデータを保存"] --> B["docker rm<br/>コンテナを削除"]
    B --> C["💥 データも消滅<br/>取り戻せない"]

たとえば PostgreSQL のコンテナを起動して、顧客データを 1万件登録したとします。その後うっかり docker rm -f db すると——1万件は跡形もなく消えます。「コンテナは気軽に作り直すもの」という Docker の思想と、「データは絶対に消したくない」という現実は、このままでは矛盾します。

この矛盾を解くのが、次のレッスンからの ボリューム。データをコンテナの外に置いて、コンテナが消えても生き残らせる仕組みです。

やってみよう

  • 下の端末で docker run -d --name db postgres:16 を実行し、docker psdb が動いていることを確認しましょう。
  • docker inspect db を実行し、"Mounts": [ ](マウントが空=データは全部コンテナ層の中)になっていることを見てください。この状態で docker rm -f db すると、中のデータは失われます。

実際に動かしてみよう

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

Docker(シミュレート)

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