第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)
-p(--project-name)←最強💪- 環境変数
COMPOSE_PROJECT_NAME - Composeファイルのトップレベル
name: - 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-lab を C:\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.project と com.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を見てる”🥲
まずこれ👇を順にやればほぼ解決します
docker compose config --volumes(探すべきvolume名を確定)(Docker Documentation)docker compose volumes(プロジェクトのvolume一覧)(Docker Documentation)docker volume ls(全体の中にあるか確認)
Q2. name: で固定すれば全部OK?
強いけど、“共有される危険” があるので、チームや複数プロジェクト運用では慎重に⚠️
(基本は -p や name:(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の対応図」を描けるようにして、さらに事故りにくくしていきます🗺️🔥