🙄

docker-compose.yml の volumes: には何を書く?

に公開
2

📦 Dockerの「volumes」ってなに?

DockerでLaravelなどの開発環境を作っていると、docker-compose.yml の中に volumes: というのをよく見かけます。

でも、初めて見る人にとっては…

volumesってなに?なんかいろいろ書き方あってわからない…!

ってなりませんか?

この記事では、Dockerの volumes をやさしく説明していきます!

✅ そもそも volumes: に書けるのは2種類ある!

docker-compose.ymlvolumes: に書く内容は、実は 2種類のまったく別の仕組みがあります。

種類 書き方の例 説明
バインドマウント ./src:/var/www/html 自分のPCとコンテナをつなぐ
ボリュームマウント db_data:/var/lib/mysql Dockerに「保存箱」を用意してもらう

それぞれの意味を順番に説明していきます👇

🧳 ① バインドマウント(自分のPCとつなぐ)

まずはよくあるこの書き方:

app:
  volumes:
    - ./src:/var/www/html

これはこういう意味です:

💻 自分のPCにある ./src フォルダと、コンテナの中の /var/www/html を同期してね

✅ つまりどうなる?

  • 自分がエディタで src/ の中身を編集すると、
  • コンテナの中の Laravel にもすぐ反映される!(再ビルドの必要がない)
  • コンテナの方で /var/www/htmlを編集するとホストPCの src/も変更される

🧠 よくコードを書き換える「アプリ」にピッタリの仕組みです。

⚠️ ここが大事:これは「volume(保存箱)」とは関係ありません!
あくまで “つないで同期するだけ” なので、データの保存はDockerではなくホストPC側で行われます。
そのため、コンテナを消してもホストPC上のデータはそのまま残ります。

でもこの「バインドマウント」も volumes: に書くので、初心者は混乱しやすいんです…!

📦 ② ボリュームマウント(Dockerが保存箱を用意)

次に、このような書き方:

db:
  volumes:
    - db_data:/var/lib/mysql

volumes:
  db_data:

これは:

🏗️ /var/lib/mysql に保存されるMySQLのデータを、Dockerが用意した「保存箱(db_data)」に入れてね!

という意味になります。

✅ なぜ使うの?

  • データベース(MySQL)は、コンテナを壊してもデータを残したい
  • だから、Dockerに永続的な保存場所(ボリューム)を作ってもらう。

🔐 ボリュームの特徴:

  • コンテナを削除しても中のデータは消えない!
  • 自動的に /var/lib/docker/volumes/... の中に保存される
  • Docker自身が管理してくれる

✅ 「ボリューム = コンテナの外にある安全な保存場所」

⚠️ バインドマウントもvolumes: に書きますが、この保存場所としてのボリュームとは関係ありません!(間違いやすいから気をつけて!)

🔄 バインドマウントとボリュームの違いまとめ

比較項目 バインドマウント ボリュームマウント
書き方例 ./src:/var/www/html db_data:/var/lib/mysql
実体のある場所 自分のPCのフォルダ Dockerが管理する専用保存エリア
データの保存方向 ホストPC ↔︎ コンテナ コンテナ → Dockerの保存箱(volume)
コンテナ削除時 ホストPCにデータが残る volumeにデータが残る
よく使うケース Laravelなどコード編集を反映したいとき DBなど壊れてほしくないデータの保存

🙋‍♀️ よくある勘違い

volumes:
  - ./src:/var/www/html

このように書いてあると、最初は:

❓「volumesって書いてあるから、これも「volume(保存箱)」に保存されるの?」

と思いがちですが、実は違います!

⚠️ バインドマウントは“つなぐだけ”なので、Dockerが中身を管理しているわけではありません。
ですが、実際のファイルはホストPCにあるため、コンテナを削除しても中身(コードなど)は消えません!

✅ バインドマウントのデータはホスト側が持っている → 安全に残る!

なので、混同しないように注意が必要です。

🛠 こんなふうに書き分ける!

services:
  app:
    volumes:
      - ./src:/var/www/html         # バインドマウント(PCとつなぐ)

  db:
    volumes:
      - db_data:/var/lib/mysql      # ボリュームマウント(データ保存)

volumes:
  db_data:  # ← Dockerが管理する保存箱の定義

Laravelのアプリには「バインドマウント」
MySQLなどのデータベースには「ボリュームマウント」

というように、目的に応じて使い分けるのがポイントです!

🎁 まとめ

  • volumes: に書く内容は2つの意味がある(ややこしい!)
  • コードなどの反映用 ↔︎ バインドマウント(ホストPCのフォルダとつなぐ)
  • DBなどの保存用 → ボリュームマウント(Dockerの保存箱に保存)

⚠️ volumes: に書いてあるからといって、すべてが「Dockerの保存箱(volumeマウント)」に保存されるとは限りません!

実際は、バインドマウントとボリュームマウントの2種類があるので、使い分けに注意しましょう。

この違いがわかれば、Dockerのvolume周りの混乱は一気にスッキリします✨

難しいところを「なんとなく」で済ませず、「ちゃんと意味がわかった!」と思えることが、学習の楽しさです。
みなさんの理解の助けになればうれしいです!

参考記事

Discussion

YuneKichiYuneKichi

バインドマウントは基本的に双方向ですよ。
コンテナ内で変更すると、そのままホスト側にも反映されます。

また、ホスト側が更新されているのでコンテナを削除しても変更は保持され、次回起動時にも変更内容が維持されます。

KOTOKOTO

ご指摘ありがとうございます。修正いたしました!