メインコンテンツまでスキップ

第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
  • 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 初期化の正体🎬」に入るので、ここで**“データの置き場”**が固まってると理解がめちゃ楽になります👍✨