第02章:“永続化”の3兄弟:bind / volume / tmpfs をざっくり掴む👪
この章は「データって、どこに置けばいいの?」問題を 3種類だけ でスパッと整理できるようになる回です😊✨ (この3つが分かると、次の「事故る前に知る:マウントが上書きになる話🫠」がめちゃ理解しやすくなります)
この章のゴール🎯
- bind / volume / tmpfs を 一言で説明できる🗣️
- 「今このデータ、どこに置く?」を 迷わず選べる🧭
docker runとcompose.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のフォルダに、コンテナが書いたファイルが出てくる!」を体験する✨
手順🧪
- 作業フォルダに
lab/bindを作る(エクスプローラでOK)📁 - そこにコンテナからファイルを書き込みます👇
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管理のデータ箱)📦🧰
ねらい🎯
- 「コンテナを作り直しても、データは残る!」を体験する✨
手順🧪
- volume を作る
docker volume create mydata
docker volume ls
- その 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"
- “別コンテナ” で同じ 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 を書くと、size や mode も指定できます(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つ挙げて」
ミニテスト📝(答えもつけるよ😊)
-
「開発中のソースをコンテナで動かしたい。保存先は?」 → bind(編集したいから)📂
-
「DBのデータ、コンテナ消しても残したい」 → volume📦
-
「ビルドや実行の一時キャッシュを速くしたい。消えてOK」 → tmpfs⚡
次につながる一言➡️🫠
次章は「マウントが“上書き”じゃなくて“隠す”」という、初心者が一番ハマる事故ポイントを わざと踏みます🔥 bind/tmpfs で “元からあったファイルが見えなくなる” 現象は公式にも書かれてます(Docker Documentation)
必要なら、この章のハンズオンを「TypeScriptでログを書いて検証する版(小さなサンプルPJつき)📦✨」にも書き換えて渡せます😊