🚀 はじめに
この記事で「できる」ようになること
- Dockerのボリュームが何か、なぜ必要かがサクッとわかる
- ボリューム/bind mount/匿名ボリュームの違いを図と例で理解
- 5分で試せるコマンド、Composeでの書き方、バックアップ方法まで把握
こんな人向け
- 中学生~大人まで、IT知識がほとんどない初心者
- 「コンテナのデータが消えない仕組みをやさしく知りたい」人
- 用語にビビらず、まずは全体像と手順を知りたい人
初心者でも安心な理由
- 身近なたとえ(USBメモリ/引っ越しのタンス)でイメージ
- 最小のコマンドから順に解説(コピペで動きます)
- この記事だけで完結(最後に信頼できる参考リンクも)
✅ 概要解説
Dockerの「ボリューム」とは?
コンテナの外に置く「保存箱(USBメモリのようなもの)」。
コンテナを入れ替えても(壊しても作り直しても)中のデータは残る仕組みです。

- コンテナは使い捨てが基本(壊して作り直すのが普通)
- でも、アプリが作るデータ(設定・画像・DBファイル) は捨てたくない
- だから「データだけは外(ホスト)に避難」→ それがボリューム
何のためにあるの?
- 保存のため:コンテナを消してもデータは生き残る
- 分離のため:アプリ(コンテナ)とデータの置き場を分ける
- 引っ越しのため:別のコンテナや別環境へデータを持ち運びやすい
ボリュームがないとどうなる?
- コンテナ内にデータを置くと、コンテナを削除した瞬間にデータも消える
- アップデートや再配布のたびに毎回ゼロからになってしまう
どんな場面で使える?
- データベース(MySQL・PostgreSQL)のデータ置き場
- WordPressのアップロード画像や設定ファイル
- アプリのログや設定(コンフィグ)
- 学習用ノート(Jupyter など)の保存先
まずは 5 分で体験(最小セット)
目的:コンテナを消しても、ファイルが残ることを確認します。
- ボリュームを作って書き込む
bash
docker volume create mydata
# ボリュームを /data にマウントし、ファイルを書き込む
docker run --rm -v mydata:/data alpine sh -c "echo 'hello volume' > /data/hello.txt && cat /data/hello.txt"
- 別のコンテナから読み出せるか確認
bash
docker run --rm -v mydata:/data alpine cat /data/hello.txt
# => hello volume (データは残っている!)
ボリュームはコンテナの外にあるため、コンテナを消してもファイルが消えません。
「bind mount」と「ボリューム」の違い
| 仕組み | 指定の仕方 | 保存場所 | 主な用途 | 特徴 |
|---|---|---|---|---|
| bind mount | -v <ホストのパス>:/パス | ホストの実フォルダ | ローカル開発で手元のファイルと同期したい | 中身が見えやすい/OS差異の影響を受けやすい |
| named volume | -v 名前:/パス | Dockerの管理領域 | 本番やDBなどDockerに任せたい保存 | 依存が少ない/バックアップが楽 |
| 匿名ボリューム | -v /パス だけ | Dockerが自動命名 | 一時的に使う(名前管理しない) | 後で探しづらいので初心者は非推奨 |
初心者は named volume(名前付きボリューム) から始めるのが安全・簡単です。
-v と --mount の違い(まずは -v でOK)
-v(短く書ける):-v myvol:/data/-v $(pwd)/data:/data--mount(読みやすい):--mount type=volume,src=myvol,target=/data
どちらもやることは同じ。最初は-vで十分です。
bind mount を体験(手元のフォルダとつなぐ)
bash
mkdir -p ./site
echo "Hi from host" > ./site/index.html
# ホストの ./site を /usr/share/nginx/html につなぐ
docker run --rm -p 8080:80 -v $(pwd)/site:/usr/share/nginx/html:ro nginx
# ブラウザで http://localhost:8080 を開くと "Hi from host"
# :ro は read-only(読み取り専用)オプション。編集はホスト側で行います。
bind mount はホスト側のファイルがそのまま反映されるので、ローカル開発に便利。
一方で、OSや権限の影響を受けやすい点に注意。
よく使うボリューム操作
bash
# 作成・一覧・詳細
docker volume create mydata
docker volume ls
docker volume inspect mydata
# 不要なボリュームを削除
docker volume rm mydata
# 使われていないボリュームを一括削除(注意)
docker volume prune
消す前にバックアップを取るのが安心です(このあと手順を紹介)。
Docker Compose での書き方(基本パターン)
yaml
# docker-compose.yml
services:
db:
image: postgres:16
environment:
- POSTGRES_PASSWORD=secret
volumes:
- pgdata:/var/lib/postgresql/data # ← データを永続化(named volume)
web:
image: nginx
ports:
- "8080:80"
volumes:
- ./site:/usr/share/nginx/html:ro # ← ローカル編集を即反映(bind mount)
volumes:
pgdata: {} # named volume を宣言
bash
docker compose up -d
docker compose down # コンテナは消えるが、pgdata の中身は残る
バックアップ/復元(最小の実用手順)
bash
# バックアップ:mydata ボリュームを .tgz に固める
docker run --rm -v mydata:/data -v $(pwd):/backup alpine \
sh -c "tar czf /backup/mydata_$(date +%Y%m%d).tgz -C /data ."
# 復元:新規ボリュームに展開(空の mydata2 を作ってから)
docker volume create mydata2
docker run --rm -v mydata2:/data -v $(pwd):/backup alpine \
sh -c "tar xzf /backup/mydata_20260302.tgz -C /data"
alpineなどの小さなユーティリティコンテナを使うと、
ホストにツールを入れずにバックアップ操作ができます。
権限(Permission)でハマったら
- LinuxではユーザーID(UID) でアクセス権が決まります
- コンテナ内ユーザーとホストの所有者がズレると書き込めないことがあります
- まずは named volume を使う/公式イメージの推奨値に合わせるのがコツ
どうしても詰まったら、
docker exec -it <container> shで中に入り、ls -lやidで誰が持ち主かを確認してみましょう。
💡 小話・豆知識・逸話
「引っ越しとタンス」
コンテナは部屋(アプリ本体)、ボリュームはタンス(データ)。
部屋を入れ替えても、タンスは廊下(ホスト側)に置いてあるから無事というイメージ。“使い捨てが前提”という発想
コンテナ時代は、アプリ本体は何度でも作り直すのが普通。
だからこそ、データだけは外に逃がす=ボリュームが重要。「名前付き」が後から効く
匿名ボリュームは後でどれがどれか分かりにくい。
名前付き(named volume) で最初から管理すると、移行やバックアップが簡単になります。
📚 参考リンク
公式サイト・ドキュメント
- Docker Docs(ストレージ:ボリュームの基本)
https://docs.docker.com/storage/volumes/ - Docker Docs(ストレージ:bind mounts)
https://docs.docker.com/storage/bind-mounts/ - Docker Docs(
--mountと-vの違い)
https://docs.docker.com/storage/ - Docker Docs(ボリュームのバックアップ/復元の例)
https://docs.docker.com/storage/volumes/#backup-restore-or-migrate-data-volumes - Docker Compose(ボリュームの定義)
https://docs.docker.com/compose/compose-file/compose-file-v3/#volumes
百科・背景
- Wikipedia:Docker
https://ja.wikipedia.org/wiki/Docker
🛠️ 関連テーマ・次に理解すると良いこと
- Docker Composeの基本:複数コンテナの連携、
depends_on、環境変数の管理
【初心者向け】Docker Composeをやさしく解説|複数コンテナを一発起動する入門
- ネットワークの基礎:ブリッジネットワーク、ポート、名前解決
- イメージの作り方:Dockerfile、ビルドのキャッシュ、ベストプラクティス

【初心者向け】Dockerfile入門|ゼロから学ぶコンテナのレシピ
- バックアップ戦略:定期バックアップ、世代管理、暗号化
- Kubernetes への発展:PersistentVolume / PersistentVolumeClaim の概念(コンテナオーケストレーションでの永続化)

【初心者向け】Kubernetes(クバネティス)をやさしく解説|コンテナ管理の“司令塔”を理解しよう
🎯 まとめ
- ボリュームは「コンテナの外の保存箱」:コンテナを消してもデータは残る
- bind mount と named volume は使い分け:
- ローカル開発は bind mount
- 本番やDBは named volume が安心
- 最初の一歩:
docker volume create→-v 名前:/パスで体験 - Compose に慣れて、バックアップもセットで覚えると実践に強い
- 困ったら公式Docs+コミュニティ記事で補強
