第07章:DBコンテナの“データディレクトリ”ってどこ?(例:Postgres)🐘
DBって、結局どこにデータを保存してるの?🤔 ここが分かると「永続化のマウント先」を迷わなくなるし、うっかりデータ消えた😇も激減します!
🎯 この章のゴール
- 「DBが実データを置いてるフォルダ(データディレクトリ)」の意味が分かる🧠
- Postgresコンテナで どこに volume をマウントすべきか言える✅
- “正しく永続化できてるか”を自分で確認できる🔎✨
7-1. そもそも「データディレクトリ」って何?📁
PostgresはDBの中身を、**1つのフォルダ(=DBクラスタ)**にまとめて保存します。 このフォルダのことをだいたい “データディレクトリ” って呼びます📦
中身はざっくりこんな感じ👇(雰囲気でOK!)
- テーブルやインデックスの実データ🧱
- 変更履歴(WAL)🧾
- 設定ファイル(
postgresql.conf/pg_hba.confなど)⚙️
この“データディレクトリ”の場所は PGDATA で決まる、というのがPostgresの基本です。(PostgreSQL)
7-2. Postgres公式イメージの「正解マウント先」はバージョンで変わる⚠️
ここが2025〜2026あたりで超重要ポイント!🧨
✅ PostgreSQL 17 以下の場合
- デフォルトの
PGDATA:/var/lib/postgresql/data - マウント先の正解:
/var/lib/postgresql/data(Docker Hub)
さらに公式が強めに注意してます👇
/var/lib/postgresql にマウントすると、コンテナ作り直し時に永続化されないケースがあるよ!って。(Docker Hub)
✅ PostgreSQL 18 以上の場合(ここが新しい!🆕)
Postgres 18 から公式イメージ仕様が変わりました。
-
PGDATAが バージョン入りになる- 例:18なら
/var/lib/postgresql/18/docker
- 例:18なら
-
VOLUME(永続化の想定先)も変わって/var/lib/postgresqlがターゲットになる
-
なので マウント先の正解も
/var/lib/postgresqlになります(Docker Hub)
👉 つまり「昔の知識のまま postgres:18 に上げたら事故る」やつです😇
7-3. じゃあ compose はどう書く?(最短の正解)🧩✨
✅ PostgreSQL 18+ 用(おすすめ例)
services:
db:
image: postgres:18
environment:
POSTGRES_PASSWORD: postgres
volumes:
- pgdata:/var/lib/postgresql
volumes:
pgdata:
ポイント:/var/lib/postgresql に named volume を貼る👍(18+ の仕様に合わせる)(Docker Hub)
✅ PostgreSQL 17 以下用(昔ながら)
services:
db:
image: postgres:17
environment:
POSTGRES_PASSWORD: postgres
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:
ポイント:17以下は /var/lib/postgresql/data が正解。公式の重要注意もここに直結します。(Docker Hub)
7-4. 「今動いてるコンテナの本当の保存先」を確認する方法🔎🐘
“思い込み”で設定すると事故るので、確認できるようになろうって章です💪✨
方法A:DB本人に聞く(いちばん強い)💬
SHOW data_directory; でデータディレクトリが出ます。
docker exec -it <dbコンテナ名> psql -U postgres -tA -c "SHOW data_directory;"
これ、サーバが実際に使ってる場所なので信頼度MAXです💯(Database Administrators Stack Exchange)
方法B:PGDATA を見る(“設定として”の場所)🧭
docker exec -it <dbコンテナ名> bash -lc 'echo "$PGDATA"'
Postgresは PGDATA を使ってデータディレクトリを決める(基本)ので、これも大事。(PostgreSQL)
方法C:「マウントが本当に刺さってる?」を確認する🧷
1) コンテナの Mounts を見る
docker inspect <dbコンテナ名> --format "{{json .Mounts}}"
ここに “どの volume がどこに刺さってるか” が出ます👀✨
2) volume 側から “実体の場所” を見る(Docker 管理領域)
docker volume inspect <volume名>
ボリュームは named/anonymous があり、Dockerが管理します。(Docker Documentation)
7-5. よくある事故パターン集😇🪤(これ踏む人めっちゃ多い)
🪤 事故1:PostgreSQL 18 に上げたのに、昔のまま /var/lib/postgresql/data にマウント
- 18+ の実データは
/var/lib/postgresql/18/docker(=/var/lib/postgresql配下) - だから
/var/lib/postgresql/dataに貼っても、そこは使われない - 結果:データが別の場所(匿名volume等)に入って、作り直しで消えた…😭 みたいになりがち (Docker Hub)
🪤 事故2:17以下で /var/lib/postgresql にマウントしてしまう
公式が「それだと永続化されないことあるよ」って書いてます。強い注意⚠️(Docker Hub)
7-6. ミニ演習:永続化できてるか“確かめる儀式”🧪✨
やることはシンプル!「作る→落とす→戻す」です😄
① 起動
docker compose up -d
② テーブルを作ってみる
docker exec -it <dbコンテナ名> psql -U postgres -c "CREATE TABLE t(id int); INSERT INTO t VALUES (1);"
③ コンテナだけ消して戻す(データ残るのが正解)
docker compose down
docker compose up -d
docker exec -it <dbコンテナ名> psql -U postgres -c "SELECT * FROM t;"
④ volume も消して戻す(データ消えるのが正解)
docker compose down -v
docker compose up -d
「どの操作で消えるのか」を体で覚えると、運用が一気に安全になります🛡️
7-7. この章の成果物✅
あなたのプロジェクトの compose に、DB用volumeマウント宣言が入った状態になっていればOKです🎉
(Postgres 18+ なら /var/lib/postgresql、17以下なら /var/lib/postgresql/data)
7-8. AIの使いどころ🤖✨(安全にね🔒)
おすすめプロンプト👇(compose を貼って聞く系)
- 「この compose の Postgres は 18+ だけど、マウント先合ってる?」🤖
- 「
SHOW data_directory;の結果がこれ。永続化のマウント先はどこにすべき?」🤖 - 「間違ったマウント先のとき、起きる事故を3つ挙げて」🤖
※パスワードや秘密情報は貼らないのが鉄則だよ〜🧯🔑
次の第8章は「初回だけ動く entrypoint 初期化の正体🎬」に入るので、ここで**“データの置き場”**が固まってると理解がめちゃ楽になります👍✨