Come usare PostgreSQL in Docker con Docker Compose e Node.js

Docker semplifica la gestione dei database come PostgreSQL, rendendo facile configurare un ambiente isolato e riproducibile. In questo articolo, vedremo come configurare PostgreSQL in Docker utilizzando Docker Compose e integrarlo con un'applicazione Node.js.

Prerequisiti

  • Docker e Docker Compose installati sulla tua macchina.
  • Node.js installato (consigliata la versione LTS).

Passo 1: Configurare Docker Compose per PostgreSQL

Inizia creando un file docker-compose.yml per configurare un servizio PostgreSQL.

  1. Crea una directory per il progetto:
  2. mkdir node-postgres-docker
    cd node-postgres-docker
  3. Crea un file docker-compose.yml nella directory e aggiungi il seguente contenuto:
  4. version: '3.8'
    
    services:
      postgres:
        image: postgres:15
        container_name: postgres_container
        environment:
          POSTGRES_USER: user
          POSTGRES_PASSWORD: password
          POSTGRES_DB: mydatabase
        ports:
          - "5432:5432"
        volumes:
          - postgres_data:/var/lib/postgresql/data
    
    volumes:
      postgres_data:
  5. Avvia PostgreSQL:
  6. docker-compose up -d
  7. Verifica che il container sia attivo:
  8. docker ps

Passo 2: Configurare Node.js

  1. Inizia creando un'applicazione Node.js:
  2. mkdir app
    cd app
    npm init -y
  3. Installa le dipendenze necessarie:
  4. npm install pg dotenv
  5. Crea un file .env per salvare le variabili di configurazione:
  6. DB_HOST=localhost
    DB_PORT=5432
    DB_USER=user
    DB_PASSWORD=password
    DB_NAME=mydatabase
  7. Crea un file index.js nella directory app con il seguente contenuto:
  8. const { Pool } = require('pg');
    require('dotenv').config();
    
    const pool = new Pool({
      host: process.env.DB_HOST,
      port: process.env.DB_PORT,
      user: process.env.DB_USER,
      password: process.env.DB_PASSWORD,
      database: process.env.DB_NAME,
    });
    
    async function testConnection() {
      try {
        const client = await pool.connect();
        console.log('Connesso al database!');
        const result = await client.query('SELECT NOW() AS current_time');
        console.log(result.rows[0]);
        client.release();
      } catch (err) {
        console.error('Errore di connessione:', err);
      } finally {
        pool.end();
      }
    }
    
    testConnection();
  9. Esegui l'applicazione per testare la connessione:
  10. node index.js

Passo 3: Persistenza dei Dati

Nel file docker-compose.yml, abbiamo configurato un volume postgres_data per garantire che i dati persistano anche se il container viene eliminato. Puoi verificare che i dati siano memorizzati in:

/var/lib/docker/volumes

Passo 4: Interazione con il Database

Puoi creare tabelle, eseguire query e interagire con il database tramite il modulo pg. Esempio:

  1. Modifica index.js per creare una tabella:
  2. async function createTable() {
      try {
        const client = await pool.connect();
        await client.query(`
          CREATE TABLE IF NOT EXISTS users (
            id SERIAL PRIMARY KEY,
            name VARCHAR(100),
            email VARCHAR(100)
          );
        `);
        console.log('Tabella creata con successo!');
        client.release();
      } catch (err) {
        console.error('Errore durante la creazione della tabella:', err);
      }
    }
    
    createTable();
  3. Esegui di nuovo l'applicazione:
  4. node index.js

Passo 5: Debug e Risoluzione dei Problemi

  • Errore di connessione al database: Verifica che il container PostgreSQL sia in esecuzione e che le credenziali siano corrette.
  • Problemi di rete: Assicurati che la porta 5432 non sia occupata da un altro processo.
  • Variabili d'ambiente: Controlla che il file .env sia configurato correttamente e caricato dall'app Node.js.

Conclusione

Utilizzare Docker Compose per PostgreSQL rende semplice configurare e gestire un database per le applicazioni Node.js. Con pochi comandi, puoi avere un ambiente pronto per lo sviluppo o la produzione. Seguendo questi passaggi, hai tutto ciĆ² che ti serve per iniziare a sviluppare applicazioni scalabili e ben strutturate con Node.js e PostgreSQL.

Torna su