メインコンテンツまでスキップ

第02章:“永続化”の3兄弟:bind / volume / tmpfs をざっくり掴む👪

この章は「データって、どこに置けばいいの?」問題を 3種類だけ でスパッと整理できるようになる回です😊✨ (この3つが分かると、次の「事故る前に知る:マウントが上書きになる話🫠」がめちゃ理解しやすくなります)


この章のゴール🎯

  • bind / volume / tmpfs を 一言で説明できる🗣️
  • 「今このデータ、どこに置く?」を 迷わず選べる🧭
  • docker runcompose.yaml の両方で 書ける🧩
  • 成果物:自分用チートシート📌 を完成させる

まずは1枚イメージ🧠🧊

  • bind mount:PCのフォルダをコンテナに“直結”する📂🔌(編集しやすい)
  • volume:Dockerが管理する“専用データ箱”📦(永続化の王道)
  • tmpfs:メモリ上の“一時置き場”⚡(高速&残さない)

ポイントはこれ👇 「コンテナを消しても残したい?」 → 残したいなら bind / volume、残したくないなら tmpfs です😊 (volume が永続化の推奨ルート、という位置づけも公式で明言されています)(Docker Documentation)


3兄弟 ざっくり比較表📊

種類消しても残る?🧨PCから見える?👀得意な用途💡よくある注意⚠️
bind✅(PCに残る)✅(そのまま)開発中のソース共有、設定ファイル差し替えホスト依存が強い/基本は書き込み可で危険も
volume✅(Dockerが保持)△(直接触りにくい)DB・アップロード・運用データ“どこにあるか分かりづらい”けど管理は強い
tmpfs❌(止めたら消える)キャッシュ、テンポラリ、秘密寄りの一時ファイルLinux機能・共有できない等の制約あり

bind の性格(ホストのファイルをコンテナが書き換えられる、readonlyも可能)(Docker Documentation) volume が永続化の推奨で、バックアップ/移行もしやすい等の理由(Docker Documentation) tmpfs はメモリに置く一時領域で止めたら消える(ただしswapに行く可能性の注意もあり)(Docker Documentation)


ハンズオン①:まず「何もマウントしない」世界を体験🫥➡️💥

「コンテナの中にファイル作ったのに、次に起動したら無い!」を先に味わいます😂

docker run --rm alpine sh -lc "echo hello > /data.txt && ls -l /data.txt && cat /data.txt"
  • その場では data.txt が見える✅
  • でも --rm でコンテナが消える=中身も消える🧹

ここがスタート地点です😊


ハンズオン②:bind mount(PCフォルダ直結)📂🔗

ねらい🎯

  • 「PCのフォルダに、コンテナが書いたファイルが出てくる!」を体験する✨

手順🧪

  1. 作業フォルダに lab/bind を作る(エクスプローラでOK)📁
  2. そこにコンテナからファイルを書き込みます👇
docker run --rm --mount type=bind,src="%cd%\lab\bind",dst=/data alpine sh -lc "date > /data/created.txt && ls -l /data && cat /data/created.txt"

%cd% は “今いるフォルダ” です。VS Codeのターミナルで実行すると分かりやすい🙌)

✅ 実行後、PC側の lab/bind/created.txt が増えていたら成功🎉

「--mount」と「-v(--volume)」の地味に大事な違い⚠️

  • -v--volume)でホスト側パスが無いと 勝手にディレクトリを作る
  • --mount無ければエラーにする(事故りにくい)

この挙動差は公式に書かれています(Docker Documentation) なのでおすすめは 基本 --mount です😊

bind の注意ポイント(超重要)🧯

  • bind はデフォルトで ホストに書き込み可能 → 間違えるとPC側を壊せます😱 → readonly / ro を付ければ読み取り専用にできます(Docker Documentation)
  • さらに、マウント先に元々ファイルがあると “隠れる(上書きじゃなくて見えなくなる)” という罠があります(Docker Documentation) (これが次章の主役🫠)

ハンズオン③:volume(Docker管理のデータ箱)📦🧰

ねらい🎯

  • 「コンテナを作り直しても、データは残る!」を体験する✨

手順🧪

  1. volume を作る
docker volume create mydata
docker volume ls
  1. その volume に書き込み
docker run --rm --mount type=volume,src=mydata,dst=/data alpine sh -lc "date > /data/created.txt && ls -l /data && cat /data/created.txt"
  1. “別コンテナ” で同じ volume を見にいく(残ってる!)
docker run --rm --mount type=volume,src=mydata,dst=/data alpine sh -lc "ls -l /data && cat /data/created.txt"

✅ 残ってたら勝ちです🎉

volume が“永続化の王道”な理由🧠✨

公式が「永続化は volume が推奨」としつつ、理由として

  • bind より バックアップ/移行しやすい
  • Docker CLI/APIで管理できる
  • 高性能I/O に向く などを挙げています(Docker Documentation)

ハンズオン④:tmpfs(メモリに置く、残さない)⚡🧠

ねらい🎯

  • 「速いけど、止めたら消える」を体験する✨
docker run --rm --mount type=tmpfs,dst=/data alpine sh -lc "echo hi > /data/tmp.txt && ls -l /data && cat /data/tmp.txt"
  • 実行中はファイルがある✅
  • でもコンテナが止まったら消える🫧

tmpfs は「メモリ上に置く一時領域」で、停止時に消える/Linuxでのみ利用可能、などが公式に整理されています(Docker Documentation) さらに「Linuxのtmpfsに直結なので、swapに退避して“ディスクに残る可能性”もある」注意も書かれています(Docker Documentation)

Windowsでも使えるの?🤔 ざっくり言うと「Linuxコンテナとして動いてるならOK」になりがちです。理由は Docker Desktop が Linux VM(WSL2含む)上で動くため、という説明が公式にあります(Docker Documentation) (ただし tmpfs 自体は “Linux機能” という前提は忘れないでOK👌)(Docker Documentation)


Composeで書くとこうなる🧩✨(開発で超よく使う形)

Compose は「サービスから mount を宣言する」だけでOK。 mount には bind / volume / tmpfs が使える、と公式も明記しています(Docker Documentation)

1) bind(ソースを共有したい)

services:
app:
image: node:24
working_dir: /app
volumes:
- type: bind
source: .
target: /app

2) volume(DBや永続データ用の“箱”)

トップレベル volumes: を作り、サービス側で使います📦 (トップレベル volumes の意味も公式に整理されています)(Docker Documentation)

services:
db:
image: postgres:18
volumes:
- db-data:/var/lib/postgresql/data

volumes:
db-data:

3) tmpfs(キャッシュなど、残したくない)

Compose には tmpfs: という専用キーがあります(Docker Documentation)

services:
app:
image: node:24
tmpfs:
- /app/cache:mode=755,uid=1000,gid=1000
- /run

さらに long syntax で type: tmpfs を書くと、sizemode も指定できます(mode は Compose 2.14.0 で導入、と明記あり)(Docker Documentation)


“設計”が超入門でも迷わない!判断軸3つ🧭✨

① PCで直接編集したい?✍️

  • YES → bind(開発のソース共有が鉄板)📂

② 消しても残したい&将来バックアップしたい?🛟

  • YES → volume(DB・アップロード・運用データはほぼこれ)📦 volume が永続化の推奨メカニズム、という位置づけも公式にあります(Docker Documentation)

③ 速度優先&残したくない?🧨

  • YES → tmpfs(キャッシュ/一時ファイル)⚡ tmpfs の性格・制約は公式の要約が強いです(Docker Documentation)

成果物:自分用チートシート📌📝

ここ、埋めれば完成です🎉(このままコピペして使ってOK)

【bind】
- 置くもの:例)ソースコード / 設定ファイル / ローカルで見たいログ
- 目的:PCで編集・確認したい
- 注意:ホスト依存、書き込み危険 → readonly検討

【volume】
- 置くもの:例)DB / アップロード / 永続データ
- 目的:消えて困る、バックアップしたい
- 注意:場所が見えづらいけど管理しやすい(CLIで追える)

【tmpfs】
- 置くもの:例)キャッシュ / 一時ファイル / 秘密寄りのテンポラリ
- 目的:残したくない・速い
- 注意:止めたら消える、Linux機能、swapに行く可能性

AI活用(この章向け)🤖✨

安全に強い使い方だけ載せます👇(秘密は貼らない前提でOK🔒)

  • 判断を速くする

    • 「このデータは bind/volume/tmpfs のどれ?理由も3つで!」
  • Compose変換

    • 「この docker run --mount ... を compose.yaml の long syntax にして」
  • 事故予防

    • 「このマウント設定で“見えなくなる/消える/壊す”リスクを3つ挙げて」

ミニテスト📝(答えもつけるよ😊)

  1. 「開発中のソースをコンテナで動かしたい。保存先は?」 → bind(編集したいから)📂

  2. 「DBのデータ、コンテナ消しても残したい」 → volume📦

  3. 「ビルドや実行の一時キャッシュを速くしたい。消えてOK」 → tmpfs


次につながる一言➡️🫠

次章は「マウントが“上書き”じゃなくて“隠す”」という、初心者が一番ハマる事故ポイントを わざと踏みます🔥 bind/tmpfs で “元からあったファイルが見えなくなる” 現象は公式にも書かれてます(Docker Documentation)


必要なら、この章のハンズオンを「TypeScriptでログを書いて検証する版(小さなサンプルPJつき)📦✨」にも書き換えて渡せます😊