タグ: PostgreSQL

  • 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