Se stai sviluppando un'applicazione che usa PostgreSQL in produzione per salvare i dati, prima o poi probabilmente dovrai eseguire PostgreSQL anche sulla tua macchina locale per lo sviluppo.
A volte puoi usare qualcosa come SQLite in sviluppo e Postgres in produzione, ma quando la tua app diventa una cosa seria vorrai che gli ambienti coincidano.
Esempio di Postgres in Docker per lo sviluppo locale
Preferisco usare docker-compose invece della CLI di docker, ma la scelta è tua. Qui li trovi entrambi.
Ti consiglio di cambiare l'immagine usata qui con la stessa versione che usi in produzione, ad esempio postgres:9.4 invece di postgres:latest.
PostgreSQL con la CLI di Docker
docker run -d \
--name psql \
-e POSTGRES_USER=postgres \
-e POSTGRES_PASSWORD=example \
-v psql:/var/lib/postgresql/data \
-p 5555:5432 \
postgres:latest
Questo avvia il tuo server PostgreSQL e lo rende disponibile su localhost:5555. Mettilo in uno script come dev/postgres e avvialo ogni volta che avvii la tua app.
PostgreSQL con Docker Compose
Preferisco usare Docker Compose, perché rende facile modificare la configurazione del database e aggiungere altri servizi (ad es. Redis) quando servono.
version: '3'
volumes:
psql:
services:
psql:
image: postgres:latest
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: example # only do this in development
volumes:
- psql:/var/lib/postgresql/data # save data between restarts
ports:
- 5555:5432 # binds port 5555 on your computer to the postgres port!
Anche in questo caso, il tuo database di sviluppo sarà disponibile su localhost:5555
Consigli per lo sviluppo locale con Postgres
Ti consigliamo di gestire Postgres in sviluppo in questo modo:
- Assicurati di usare l'immagine ufficiale di Postgres.
- Salva la configurazione di Postgres in un file Docker Compose (trovi un esempio qui sotto).
- Aggiungi il file docker compose al controllo di versione (come Git) insieme al codice sorgente del progetto.
- Fai in modo che tutto il team usi le stesse impostazioni di Postgres in sviluppo.
- Inizializza la tua immagine Postgres (se necessario) usando alcune delle funzionalità più avanzate dell'immagine Docker.
- Specifica un
volumein cui il container salvi i dati, così restano persistenti tra un'esecuzione e l'altra. - Usa le funzionalità integrate dell'immagine per eseguire SQL di inizializzazione, impostare le credenziali e creare i database.
Docker vs installazione di Postgres sul sistema
Puoi semplicemente installare Postgres sul tuo computer. Esistono build per tutti e tre i principali sistemi operativi. Sembra la strada più semplice, ma questo approccio ha alcuni problemi.
Problemi di un'installazione di Postgres a livello di sistema
- Postgres resterà sempre in esecuzione come servizio di sistema
- Puoi avere facilmente una sola versione di Postgres installata e in esecuzione alla volta
- Ogni app che ha bisogno del proprio database Postgres dovrà condividere la stessa istanza
- Richiede accesso root/amministratore alla tua macchina
- Se lavori in un team, ogni configurazione potrebbe essere leggermente diversa, e questo rende difficile condividere le configurazioni di sviluppo.
Docker risolve (quasi) tutti questi problemi
Con Docker ogni progetto in sviluppo può avere il proprio Postgres bloccato alla versione corretta, con una configurazione standard condivisa con i colleghi e salvabile nel controllo di versione.
Il problema più grande nell'eseguire Postgres in un container Docker è, beh, imparare Docker se non l'hai mai usato.
Usare Docker per Postgres in produzione
Se usi Docker puro in produzione, avere un database Postgres è molto simile alla nostra configurazione di sviluppo
version: '3.8'
volumes:
psql_data:
driver: local
services:
postgres:
image: postgres:14
container_name: postgres
restart: always
environment:
POSTGRES_USER: myuser
POSTGRES_PASSWORD: mysecurepassword
POSTGRES_DB: mydatabase
volumes:
- psql_data:/var/lib/postgresql/data
- ./backups:/backups
ports:
- 5432:5432
healthcheck:
test: ["CMD-SHELL", "pg_isready -U myuser"]
interval: 30s
timeout: 10s
retries: 5
Backup e ripristino di database Postgres in Docker
Quella che segue non è una guida completa alla gestione di Postgres in produzione, ma dovrebbe essere un buon punto di partenza per una semplice strategia di backup.
In un ambiente di produzione, i backup di PostgreSQL si possono automatizzare esportando periodicamente il database in un file di backup. Puoi farlo pianificando un cron job o un container di backup dedicato che esegue periodicamente un comando pg_dump per esportare i dati del database in una directory (ad es. /backups) montata sul sistema host. La cartella backups nella configurazione sopra è montata su una directory della macchina host, dove i file di backup possono essere conservati in sicurezza.
Creare backup di Postgres in Docker
Per una strategia di backup di base:
- Esegui
pg_dumpper esportare il database:docker exec postgres pg_dump -U myuser mydatabase > ./backups/backup_$(date +%F).sqlQuesto comando crea un backup del database nella directory
backups. - Puoi configurare un cron job o usare un altro sistema di pianificazione per eseguire questo comando a intervalli regolari (ad es. ogni giorno o ogni settimana).
0 2 * * * docker exec postgres pg_dump -U myuser mydatabase > /path/to/backups/backup_$(date +\%F).sql - Carica il backup su S3 o su uno storage simile
aws s3 cp ./backups/backup_$(date +%F).sql s3://your-bucket-name/path/to/backup/Inoltre, potresti configurare l'archiviazione WAL (Write-Ahead Logging) per creare backup continui delle modifiche e consentire il ripristino point-in-time, ma questo va oltre lo scopo dell'articolo: consulta la documentazione ufficiale per maggiori informazioni.
Ripristinare un backup
- Scarica il backup da S3
aws s3 cp s3://your-bucket-name/path/to/backup/backup_YYYY-MM-DD.sql ./backups/Questo comando scarica il file di backup da S3 nella tua directory backups locale.
- Ripristinalo nel tuo database
docker exec -i postgres psql -U myuser -d mydatabase < ./backups/backup_YYYY-MM-DD.sqlQuesto comando usa psql per ripristinare il file di backup nel tuo container PostgreSQL in esecuzione.
Conclusioni
Ora dovresti conoscere le basi per avviare e gestire un container Docker di Postgres. Tieni presente che per gestire un cluster Postgres in produzione servono molte altre cose (ad es. monitoraggio, alert), ma speriamo che questa guida ti aiuti a iniziare.
Beekeeper Studio è una GUI per database gratuita & open source
Il miglior strumento per query & editor SQL che abbia mai usato. Offre tutto ciò che mi serve per gestire il mio database. - ⭐⭐⭐⭐⭐ Mit
Beekeeper Studio è veloce, intuitivo e facile da usare. Beekeeper supporta tantissimi database e funziona alla grande su Windows, Mac e Linux.
Cosa dicono gli utenti di Beekeeper Studio
"Beekeeper Studio ha sostituito completamente il mio vecchio flusso di lavoro con PostgreSQL. È veloce, intuitivo e rende di nuovo piacevole lavorare con i database."
"Ho provato molte GUI per database, ma Beekeeper trova l'equilibrio perfetto tra funzionalità e semplicità. Funziona e basta."