Skip to main content

第40章:ミニまとめ:Composeで“開発スタック一発起動”完成🏁🎉

ここまで来たら、もう「環境構築で消耗する」フェーズは卒業です!🎓✨ この章は Todo API(Node/TS)+DB(PostgreSQL)+(余裕あればRedis) を、**docker compose up 一発で立ち上げる“完成形”**に仕上げます💪😆


🎯 この章でできるようになること(ゴール)✅

  • API+DBを1コマンドで起動できる🚀
  • DBの準備待ち(起動順/Ready問題)をhealthcheck+depends_onで回避できる🧠✨ (Docker Documentation)
  • テンプレ化して「次の個人開発でもコピペで即起動」できる📦✨
  • (余裕あれば)Redisを必要なときだけ追加できる🧃🔥

🧩 完成イメージ(ざっくり図)🗺️

  • ブラウザ/HTTPクライアント → localhost:3000API
  • API → db:5432PostgreSQL
  • (任意)API → redis:6379Redis

🧰 ハンズオン:compose.yaml を“完成形”にする✍️🐳

ここからは コピペでOK にしてあります😆📋 ※最近のComposeは トップレベルの version: を書かなくてOK(むしろ警告の原因になりがち)です🧹✨

1) compose.yaml(Todo API+Postgres+Redis optional)📄

services:
api:
image: node:24
working_dir: /app
volumes:
- ./:/app
- node_modules:/app/node_modules
ports:
- "3000:3000"
environment:
# APIがDBへ繋ぐ。ホスト側のポートは関係なく、サービス名 db でOK 👍
DATABASE_URL: ${DATABASE_URL}

# Redisを使う場合だけ有効にする(後述の profiles とセット)
REDIS_URL: ${REDIS_URL:-}

depends_on:
db:
condition: service_healthy
redis:
condition: service_started

# ✅ node_modules が空ならインストール → 以後はスキップ(毎回やらない)🎉
command: >
sh -lc "
if [ ! -d node_modules ] || [ -z \"$(ls -A node_modules 2>/dev/null)\" ]; then
npm ci;
fi;
npm run dev
"

db:
image: postgres:18
environment:
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}

# ホスト側でPostgresが動いてても被りにくいよう 5433 を使う例(中は5432のまま)
ports:
- "5433:5432"

# ✅ PostgreSQL 18 の公式イメージは、データ永続化の推奨が「/var/lib/postgresql」寄りに更新されてます
# (従来の /var/lib/postgresql/data 固定で書く古い例に注意)⚠️
volumes:
- db_data:/var/lib/postgresql

healthcheck:
test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
interval: 10s
timeout: 10s
retries: 5
start_period: 30s

redis:
image: redis:8
profiles: ["cache"] # ← これがポイント!必要な時だけ起動できる🎯
ports:
- "6380:6379"
volumes:
- redis_data:/data
command: ["redis-server", "--appendonly", "yes"]

volumes:
db_data:
node_modules:
redis_data:
  • depends_oncondition: service_healthy で「DBが 動いてるだけ じゃなく、接続受付できる状態 まで待つ」ようにできます🧠✨ (Docker Documentation)
  • Redisは profiles必要なときだけ起動できます🎉(後でコマンド出します👇)

Nodeは v24がActive LTSとして案内されています(2026年初頭時点)なので、教材の基準として node:24 を採用します🧱✨ (Docker Documentation) PostgreSQL 18系も公式で継続リリースされています🗄️✨ (PostgreSQL)


2) .env を作る(Composeが読み込む)🔐📝

プロジェクト直下に .env を作ってください👇

## --- DB(PostgreSQL)---
POSTGRES_USER=todo
POSTGRES_PASSWORD=todo_pass
POSTGRES_DB=todo

## API → DB の接続文字列(サービス名 db を使うのがポイント)
DATABASE_URL=postgresql://todo:todo_pass@db:5432/todo

## --- Redis(使うときだけ)---
REDIS_URL=redis://redis:6379

🚀 起動してみよう!「一発起動」タイム!🎉

✅ API+DB(基本セット)

docker compose up

ログが流れて、最後にAPIが「起動したっぽい」表示になればOK!😆🎊

✅ Redisも一緒に(必要なときだけ)

docker compose --profile cache up

profiles を使うと「普段はいらないRedis」を 必要な時だけ追加できて最高です🧃✨ Redis公式イメージは「外部に晒すならパスワード等が必要」な注意があるので、公開範囲には気をつけてね⚠️ (Docker Documentation)


🔎 動作確認チェック(最短)✅✨

1) APIが見える?🌐

PowerShellなら(curl ではなく curl.exe が安全)👇

curl.exe http://localhost:3000/health

/health が無い場合は、GET / でもOK🙆‍♂️ (この教材のTodo APIに合わせて、healthエンドポイントがある前提で育てるのがオススメ!💚)

2) DBに入れる?🗄️

docker compose exec db psql -U todo -d todo

入れたら勝ち🏆🎉 抜けるのは \q

3) Redis(起動したときだけ)🧃

docker compose exec redis redis-cli ping

PONG ならOK🙌


🧯 よくある詰まりポイント(この章の即効薬)💊😵‍💫

🪤 ① 「version is obsolete」みたいな警告が出る

  • version: を消す(今どきのComposeは不要)🧹✨

🪤 ② APIが先に起動してDB接続で落ちる

  • この章の depends_on: condition: service_healthyhealthcheck が効きます🔥 (Docker Documentation)
  • それでもアプリ側がリトライしない設計だと落ちることがあるので、アプリ側も接続リトライするのが強い💪(第51章以降のデバッグ作法で鍛える🏋️)

🪤 ③ DBデータが消えた😭

  • docker compose down -v をやると ボリュームごと消えます🧨
  • 「初期化したい時だけ」使うコマンドにしようね😇

📦 テンプレ化:次の個人開発で“秒速起動”するセット🎁✨

この3点をテンプレとして固定すると最強です💪😆

  1. compose.yaml(今日の完成版)
  2. .env.example(値はダミーでOK)
  3. package.json の “一発コマンド” 化(npm scripts)

例:package.json に入れる🎮

{
"scripts": {
"stack:up": "docker compose up",
"stack:up:cache": "docker compose --profile cache up",
"stack:down": "docker compose down",
"stack:reset": "docker compose down -v && docker compose up",
"stack:ps": "docker compose ps",
"stack:logs": "docker compose logs -f --tail=200"
}
}

これで、次回からは👇だけで起動できる!最高!🎉

npm run stack:up

🤖 AI活用(この章の“勝ちパターン”プロンプト集)🧠✨

✅ 1) 自分のPJに合わせてテンプレ化

  • 「この compose.yaml を、次のプロジェクトでも使えるようにテンプレ化して。サービス名・ポート・環境変数を変更しやすい形に整えて、.env.example も作って」

✅ 2) DB接続のエラーを“切り分け手順”にする

  • 「このログ貼るね。原因候補を3つに絞って、確認コマンドと直し方を順番に出して」

✅ 3) Redisを“入れるべきか”相談する(迷ったらコレ)

  • 「Todo APIにRedisを入れるなら用途は何が現実的?キャッシュ/セッション/ジョブキューで、優先度と導入コストを比較して」

🌟 ボーナス:さらに快適にする “Compose Watch” 🕶️✨

最近のComposeには Watch(ファイル変更に追従) があり、条件が合うと「起動したら放置でOK」になって気持ちいいです😆

  • docker compose up --watch で起動できる(Compose 2.22+)✨ (Docker Documentation)
  • ただし watch は基本 build: 前提で、image: だけのサービスは追跡しません(今の段階では“次章以降”が本番)📌 (Docker Documentation)

第41章〜のDockerfileに入ったら、Watchが本領発揮します🔥(ここで繋がる!)


✅ この章の“合格ライン”チェックリスト📋🎉

  • docker compose upAPI+DBが起動する
  • curl.exe http://localhost:3000/health が返る
  • docker compose exec db psql ... でDBに入れる
  • (任意)docker compose --profile cache up でRedisも起動できる
  • package.json に “一発起動コマンド” を用意できた

次は 第41章(Dockerfileって何?) に突入です🔥 ここまでのComposeがあるから、Dockerfileが「ただのレシピ」じゃなく 実戦の武器になりますよ💪😄