🚀 はじめに

この記事で「できる」ようになること

  • Dockerのボリュームが何か、なぜ必要かがサクッとわかる
  • ボリューム/bind mount匿名ボリュームの違いを図と例で理解
  • 5分で試せるコマンドComposeでの書き方バックアップ方法まで把握

こんな人向け

  • 中学生~大人まで、IT知識がほとんどない初心者
  • 「コンテナのデータが消えない仕組みをやさしく知りたい」人
  • 用語にビビらず、まずは全体像と手順を知りたい人

初心者でも安心な理由

  • 身近なたとえ(USBメモリ/引っ越しのタンス)でイメージ
  • 最小のコマンドから順に解説(コピペで動きます)
  • この記事だけで完結(最後に信頼できる参考リンクも)

✅ 概要解説

Dockerの「ボリューム」とは?

コンテナの外に置く「保存箱(USBメモリのようなもの)」
コンテナを入れ替えても(壊しても作り直しても)中のデータは残る仕組みです。

Dockerボリュームのイメージ:コンテナの外にある保存箱
  • コンテナは使い捨てが基本(壊して作り直すのが普通)
  • でも、アプリが作るデータ(設定・画像・DBファイル) は捨てたくない
  • だから「データだけは外(ホスト)に避難」→ それがボリューム

何のためにあるの?

  • 保存のため:コンテナを消してもデータは生き残る
  • 分離のため:アプリ(コンテナ)とデータの置き場を分ける
  • 引っ越しのため:別のコンテナや別環境へデータを持ち運びやすい

ボリュームがないとどうなる?

  • コンテナ内にデータを置くと、コンテナを削除した瞬間にデータも消える
  • アップデートや再配布のたびに毎回ゼロからになってしまう

どんな場面で使える?

  • データベース(MySQL・PostgreSQL)のデータ置き場
  • WordPressのアップロード画像や設定ファイル
  • アプリのログ設定(コンフィグ)
  • 学習用ノート(Jupyter など)の保存先

まずは 5 分で体験(最小セット)

目的:コンテナを消しても、ファイルが残ることを確認します。

  1. ボリュームを作って書き込む
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"
  1. 別のコンテナから読み出せるか確認
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 -lid誰が持ち主かを確認してみましょう。


💡 小話・豆知識・逸話

  • 「引っ越しとタンス」
    コンテナは部屋(アプリ本体)、ボリュームはタンス(データ)
    部屋を入れ替えても、タンスは廊下(ホスト側)に置いてあるから無事というイメージ。

  • “使い捨てが前提”という発想
    コンテナ時代は、アプリ本体は何度でも作り直すのが普通。
    だからこそ、データだけは外に逃がす=ボリュームが重要。

  • 「名前付き」が後から効く
    匿名ボリュームは後でどれがどれか分かりにくい
    名前付き(named volume) で最初から管理すると、移行やバックアップが簡単になります。


📚 参考リンク

公式サイト・ドキュメント

百科・背景


🛠️ 関連テーマ・次に理解すると良いこと


🎯 まとめ

  • ボリュームは「コンテナの外の保存箱」:コンテナを消してもデータは残る
  • bind mount と named volume使い分け
    • ローカル開発は bind mount
    • 本番やDBは named volume が安心
  • 最初の一歩docker volume create-v 名前:/パス で体験
  • Compose に慣れて、バックアップもセットで覚えると実践に強い
  • 困ったら公式Docs+コミュニティ記事で補強