Si tu développes une application qui utilise PostgreSQL en production pour stocker ses données, tu auras sûrement besoin, à un moment ou un autre, de faire tourner PostgreSQL en local pour le développement.
Parfois, on peut utiliser quelque chose comme SQLite en développement et Postgres en production, mais dès que ton app devient sérieuse, tu voudras que tes environnements soient identiques.
Exemple de Postgres dans Docker pour le développement local
Je préfère utiliser docker-compose plutôt que la CLI docker, mais c’est à toi de choisir. Je présente les deux ici.
Je te conseille de modifier l’image utilisée ici pour qu’elle corresponde à la version que tu utilises en production, par exemple postgres:9.4 au lieu de postgres:latest.
PostgreSQL avec la CLI 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
Cette commande démarre ton serveur PostgreSQL et le rend accessible sur localhost:5555. Mets-la dans un script comme dev/postgres et lance-le chaque fois que tu démarres ton app.
PostgreSQL avec Docker Compose
Je préfère utiliser Docker Compose, car cela permet de modifier facilement la configuration de la base de données et d’ajouter d’autres services (par ex. Redis) dès que j’en ai besoin.
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!
Là encore, ta base de données de développement sera accessible sur localhost:5555
Recommandations pour le développement local avec Postgres
Nous te recommandons de gérer ton Postgres de développement de la façon suivante :
- Assure-toi d’utiliser l’image Postgres officielle.
- Stocke ta configuration Postgres dans un fichier Docker Compose (voir l’exemple ci-dessous).
- Versionne le fichier docker compose (par exemple avec Git) avec le code source de ton projet.
- Fais en sorte que toute ton équipe utilise les mêmes paramètres Postgres en développement.
- Initialise ton image Postgres (si besoin) grâce à certaines fonctionnalités avancées de l’image Docker.
- Pense à spécifier un
volumeoù le conteneur stockera ses données, pour qu’elles persistent d’un lancement à l’autre. - Utilise les fonctionnalités intégrées de l’image pour exécuter du SQL d’initialisation, définir les identifiants et créer les bases de données.
Docker ou installation système de Postgres
Tu peux tout simplement installer Postgres sur ton ordinateur. Il existe des builds pour les trois principaux systèmes d’exploitation. Ça semble être la solution la plus simple, mais cette approche pose quelques problèmes.
Les problèmes d’une installation système de Postgres
- Postgres tournera en permanence comme service système
- Tu ne peux facilement installer et faire tourner qu’une seule version de Postgres à la fois
- Chaque app qui a besoin de sa propre base Postgres devra partager la même instance
- Nécessite un accès root/admin à ta machine
- Si tu travailles en équipe, chaque installation peut être légèrement différente, ce qui complique le partage des configs de dev.
Docker résout (la plupart de) ces problèmes
Avec Docker, chaque projet en développement peut avoir son propre Postgres verrouillé sur la bonne version, avec une configuration standard partagée par toute l’équipe et versionnée dans le contrôle de source.
Le plus gros problème quand on fait tourner Postgres dans un conteneur Docker, c’est… d’apprendre Docker si tu ne l’as jamais utilisé.
Utiliser Docker pour Postgres en production
Si tu utilises directement Docker en production, mettre en place une base Postgres ressemble beaucoup à notre configuration de développement
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
Sauvegarder et restaurer des bases Postgres dans Docker
Ce qui suit n’est pas un guide complet sur la gestion de Postgres en production, mais devrait te servir de point de départ pour une stratégie de sauvegarde simple.
En production, les sauvegardes PostgreSQL peuvent être automatisées en exportant régulièrement la base de données dans un fichier de sauvegarde. Pour cela, tu peux planifier une tâche cron ou utiliser un conteneur de sauvegarde dédié qui exécute périodiquement une commande pg_dump pour exporter les données dans un répertoire (par ex. /backups) monté sur le système hôte. Le dossier backups de la configuration ci-dessus est monté sur un répertoire de la machine hôte, où les fichiers de sauvegarde peuvent être stockés en toute sécurité.
Créer des sauvegardes de Postgres dans Docker
Pour une stratégie de sauvegarde basique :
- Lance
pg_dumppour exporter la base de données :docker exec postgres pg_dump -U myuser mydatabase > ./backups/backup_$(date +%F).sqlCette commande crée une sauvegarde de la base de données dans le répertoire
backups. - Tu peux configurer une tâche cron ou un autre mécanisme de planification pour exécuter cette commande à intervalles réguliers (par ex. tous les jours ou toutes les semaines).
0 2 * * * docker exec postgres pg_dump -U myuser mydatabase > /path/to/backups/backup_$(date +\%F).sql - Envoie la sauvegarde sur S3 ou un espace de stockage similaire
aws s3 cp ./backups/backup_$(date +%F).sql s3://your-bucket-name/path/to/backup/Tu peux aussi mettre en place l’archivage WAL (Write-Ahead Logging) pour sauvegarder les modifications en continu et permettre une restauration à un instant précis, mais cela dépasse le cadre de cet article : consulte la documentation officielle pour en savoir plus.
Restaurer une sauvegarde
- Télécharge la sauvegarde depuis S3
aws s3 cp s3://your-bucket-name/path/to/backup/backup_YYYY-MM-DD.sql ./backups/Cette commande télécharge le fichier de sauvegarde depuis S3 dans ton répertoire local de sauvegardes.
- Restaure-la dans ta base de données
docker exec -i postgres psql -U myuser -d mydatabase < ./backups/backup_YYYY-MM-DD.sqlCette commande utilise psql pour restaurer le fichier de sauvegarde dans ton conteneur PostgreSQL en cours d’exécution.
Pour conclure
Tu as maintenant les bases pour démarrer et gérer un conteneur Docker Postgres. Note qu’il te faudra bien d’autres choses pour faire tourner un cluster Postgres en production (par ex. monitoring, alertes), mais j’espère que ce qui précède t’aidera à démarrer.
Beekeeper Studio est une interface de base de données gratuite & open source
Le meilleur outil de requêtes & éditeur SQL que j’aie jamais utilisé. Il m’offre tout ce dont j’ai besoin pour gérer ma base de données. - ⭐⭐⭐⭐⭐ Mit
Beekeeper Studio est rapide, intuitif et facile à utiliser. Beekeeper prend en charge plein de bases de données et fonctionne parfaitement sous Windows, Mac et Linux.
Ce que les utilisateurs disent de Beekeeper Studio
« Beekeeper Studio a complètement remplacé mon ancien workflow PostgreSQL. C’est rapide, intuitif, et ça rend le travail sur les bases de données à nouveau agréable. »
« J’ai essayé beaucoup d’interfaces de bases de données, mais Beekeeper trouve le parfait équilibre entre fonctionnalités et simplicité. Ça marche, tout simplement. »