Docker ComposeでNode.js + PostgreSQL環境を5分で構築する

開発環境の構築は地味に時間がかかる作業です。Docker Composeを使えば、Node.jsアプリケーションとPostgreSQLデータベースを含む開発環境を、たった1コマンドで立ち上げることができます。

前提条件

  • Docker Desktop がインストール済み
  • docker compose コマンドが使える状態

プロジェクト構成

my-app/
├── docker-compose.yml
├── Dockerfile
├── package.json
├── src/
│   └── index.js
└── .env

docker-compose.yml

version: "3.8"
services:
  app:
    build: .
    ports:
      - "3000:3000"
    environment:
      - DATABASE_URL=postgresql://myuser:mypass@db:5432/mydb
      - NODE_ENV=development
    volumes:
      - ./src:/app/src
    depends_on:
      db:
        condition: service_healthy

  db:
    image: postgres:16-alpine
    environment:
      POSTGRES_USER: myuser
      POSTGRES_PASSWORD: mypass
      POSTGRES_DB: mydb
    ports:
      - "5432:5432"
    volumes:
      - pgdata:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U myuser -d mydb"]
      interval: 5s
      timeout: 5s
      retries: 5

volumes:
  pgdata:

Dockerfile

FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY src/ ./src/
EXPOSE 3000
CMD ["node", "src/index.js"]

Node.jsアプリケーション

// src/index.js
const { Pool } = require("pg");
const http = require("http");

const pool = new Pool({
  connectionString: process.env.DATABASE_URL,
});

const server = http.createServer(async (req, res) => {
  try {
    const result = await pool.query("SELECT NOW() as current_time");
    res.writeHead(200, { "Content-Type": "application/json" });
    res.end(JSON.stringify({
      message: "Hello from Docker!",
      db_time: result.rows[0].current_time,
    }));
  } catch (err) {
    res.writeHead(500);
    res.end(JSON.stringify({ error: err.message }));
  }
});

server.listen(3000, () => {
  console.log("Server running on port 3000");
});

起動と確認

# ビルド&起動
docker compose up -d

# ログ確認
docker compose logs -f app

# 動作確認
curl http://localhost:3000

開発時のTips

  • volumesでsrcディレクトリをマウントしておけば、ファイル変更が即座に反映されます(nodemonと組み合わせると便利)
  • healthcheckを設定しておくと、DBが起動する前にアプリが接続しようとするエラーを防げます
  • PostgreSQLのデータはnamed volumeに保存されるので、コンテナを再作成してもデータは消えません

まとめ

Docker Composeを使えば、チームメンバー全員が同じ環境で開発できます。新メンバーのオンボーディングも「git cloneしてdocker compose up」だけで完了。環境差異によるトラブルから解放されます。

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

IP: 取得中...
216.73.216.31216.73.216.31