Skip to main content

第05章:「volume名が思ったのと違う」問題を先に潰す😇

開発でよくあるのがコレ👇

  • Composeでは db-data って書いたのに、docker volume ls を見ると something_db-data みたいな名前で出てくる😵‍💫
  • フォルダ名を変えたら、別のvolumeが増えた(データが消えたように見える)😱

この章は、その「ズレ」を仕組みとして理解して、事故らない運用にするのがゴールです✨


ゴール🎯

  • ✅ なぜvolume名が“増殖”するのか説明できる
  • ✅ “今動いてるComposeがどのvolumeを使ってるか”を確実に特定できる🔎
  • ✅ 目的に応じて volume名を固定できる(固定しちゃダメな場面も分かる)🧠

まず結論:ズレの正体は「プロジェクト名」📛

Composeは プロジェクト名(project name) を使って、コンテナ/ネットワーク/volume等を“グルーピング”します。 デフォルトのプロジェクト名は Composeファイルが入ってるディレクトリ名 です。(Docker Documentation)

なので、Compose内で volumes: data: と書いても、実体はだいたいこう👇

  • Compose内の呼び名:data
  • 実体のvolume名:<project>_data(例:todoapp_data

Dockerの公式リファレンスでも、external volumeの説明で {project_name}_db-data みたいに“プロジェクト名が前に付く”前提で書かれています。(Docker Documentation)


プロジェクト名はどこで決まる?(優先順位)🥇🥈🥉

Composeはプロジェクト名を複数の方法で決められて、優先順位があります👇(Docker Documentation)

  1. -p--project-name)←最強💪
  2. 環境変数 COMPOSE_PROJECT_NAME
  3. Composeファイルのトップレベル name:
  4. Composeファイルがあるディレクトリ名 (その他細かいルールもあり)

name: は Compose仕様として「プロジェクト名に使う」と明記されています。(Docker Documentation) CLIの -p も、docker compose のオプションとして定義されています。(Docker Documentation)


ハンズオン:わざと“ズレ”を起こして観察しよう🧪👀

ここからは 「事故の原因を体に覚えさせる」 パートです😆🔥

① 最小のcomposeを作る📄

適当なフォルダを作って(例:C:\work\vol-lab)、compose.yaml を作成👇

services:
app:
image: busybox
command: sh -c "echo hello > /data/hello.txt && sleep 3600"
volumes:
- data:/data

volumes:
data:

起動👇

docker compose up -d

② “実体のvolume名”を確認する🔎

まず、Compose側から見える一覧👇(プロジェクトに紐づくvolumeが出る)(Docker Documentation)

docker compose volumes

さらに「Composeが解決したvolume名だけ」を出す方法👇(地味に便利!)(Docker Documentation)

docker compose config --volumes

最後に、Docker全体のvolume一覧👇

docker volume ls

たぶん vol-lab_data みたいな名前が見えるはずです(vol-lab がフォルダ名なら)。


事故パターン:フォルダ名を変えると“別プロジェクト扱い”😱📦

C:\work\vol-labC:\work\vol-lab-2 にリネームして、同じ compose.yaml で起動してみる👇

docker compose up -d
docker volume ls

すると…

  • 旧:vol-lab_data
  • 新:vol-lab-2_data

みたいに、別のvolumeが作られて「データ消えた!?」状態になります😵‍💫 (消えてない。前のvolumeは残ってるだけ!)


“今どれ使ってる?”を確実に特定する3点セット🧰✨

1) まず docker compose config --volumes を見る👓

Composeが解決したvolume名が出ます。(Docker Documentation) 「探すべきvolume名」が確定します👍

2) docker compose volumes でプロジェクトに紐づくものを一覧🗂️

プロジェクト単位で見られるので、迷子になりにくいです。(Docker Documentation)

3) docker volume inspect で“ラベル”を見る🏷️

Composeは named volume に com.docker.compose.projectcom.docker.compose.volume のラベルを付けます。(Docker Documentation) だから inspect すると「どのプロジェクトの何のvolumeか」が追跡できます✨


解決策A:プロジェクト名を固定する(いちばん安全)🛡️

方法A-1:-p を使う(最優先で効く)🥇

docker compose -p myapp up -d

-p が最優先だよ、という優先順位が公式に書かれています。(Docker Documentation)

方法A-2:環境変数 COMPOSE_PROJECT_NAME 🥈

PowerShellなら👇

$env:COMPOSE_PROJECT_NAME="myapp"
docker compose up -d

(優先順位で2位です)(Docker Documentation)

方法A-3:Composeファイルに name: 🥉

name: myapp
services:
app:
image: busybox
command: sh -c "sleep 3600"

トップレベル name: がプロジェクト名になるのは仕様として明記されています。(Docker Documentation)


解決策B:volume名そのものを固定する(強いけど混ぜる危険あり)⚠️🔩

Composeのvolume定義には name: があり、「その名前をそのまま使う(プロジェクト名でスコープされない)」 と書かれています。(Docker Documentation)

例👇(実体名が必ず my-app-data になる)

services:
app:
image: busybox
command: sh -c "sleep 3600"
volumes:
- data:/data

volumes:
data:
name: "my-app-data"

これ、便利だけど注意点⚠️

  • ✅ フォルダ名が変わっても同じvolumeを掴める
  • 別プロジェクトでも同じvolumeを共有しちゃう(データが混ざる)😱

なので、初心者のうちは基本は 「プロジェクト名を固定」 を推します👍


解決策C:external volumeとして扱う(“ライフサイクルは外部管理”)🧱

external: true を付けると、Composeは「そのvolumeは既に存在する前提」で扱い、存在しなければエラーになります。(Docker Documentation) しかも docker compose down でも externalのネットワーク/volumeは消されない と明記されています。(Docker Documentation)

volumes:
db-data:
external: true

“消した/消えてない”のルールもここで押さえる🧯

docker compose down は、デフォルトではnamed volumeを消しません。(Docker Documentation) 消したいときは -v/--volumes を付ける(composeファイルで宣言したnamed volumeと、匿名volumeが対象)。(Docker Documentation)

docker compose down
docker compose down -v

よくあるQ&A(ここで詰まりがち)🧠💬

Q1. 「データ消えた!」→ だいたい“別volumeを見てる”🥲

まずこれ👇を順にやればほぼ解決します

  1. docker compose config --volumes(探すべきvolume名を確定)(Docker Documentation)
  2. docker compose volumes(プロジェクトのvolume一覧)(Docker Documentation)
  3. docker volume ls(全体の中にあるか確認)

Q2. name: で固定すれば全部OK?

強いけど、“共有される危険” があるので、チームや複数プロジェクト運用では慎重に⚠️ (基本は -pname:(project名)固定が安全)


成果物(この章のゴール物)📝✨

あなたのプロジェクト用に、これだけ書いたメモを作ってください👇

  • ✅ 私のプロジェクト名の決め方:-p / env / name: / ディレクトリ名
  • ✅ 私のDB用volumeの実体名:docker compose config --volumes の結果
  • ✅ “初期化し直す時に消すコマンド”:docker compose down -v を使う条件(慎重に!)(Docker Documentation)

AIの使いどころ🤖🛡️

たとえばこう聞くと強いです👇

  • docker compose config --volumes の結果がこれ。どのvolumeをバックアップすべき?
  • 「フォルダ名を変えたらvolumeが増えた。最短で元のデータに戻す手順を、破壊コマンド注意で書いて」

※コピペする情報は、秘密(APIキー等)を混ぜないのが鉄則🔒(AI拡張を使う時は特に) 会社名だけ出すなら:OpenAI や GitHub など。


まとめ:今日の最重要3つ🏁✨

  • ズレの原因はプロジェクト名(デフォルトはディレクトリ名)(Docker Documentation)
  • “どれ使ってる?”は docker compose config --volumes で確定できる(Docker Documentation)
  • 安全策は プロジェクト名固定(-p / name:、volume名固定(volumes: ... name:)は共有事故に注意(Docker Documentation)

次の章(第6章)は、この理解を土台にして「ホスト/コンテナ/volumeの対応図」を描けるようにして、さらに事故りにくくしていきます🗺️🔥