Accéder au contenu principal

PostgreSQL dans Docker : Un guide pas à pas pour les débutants

Votre guide complet pour l'exécution de PostgreSQL dans Docker - de la configuration aux meilleures pratiques - afin que vous puissiez améliorer votre flux de travail de développement sans maux de tête.
Actualisé 15 avr. 2025  · 15 min de lecture

La mise en place d'un environnement de développement PostgreSQL ne devrait pas nécessiter des heures de configuration et de dépannage - et avec Docker, ce n'est pas le cas.

Docker offre un moyen simple de rendre PostgreSQL opérationnel en quelques minutes, quel que soit votre système d'exploitation. En quelques commandes seulement, vous pouvez créer un environnement de base de données entièrement fonctionnel et isolé de votre système, évitant ainsi les conflits de dépendances et les problèmes d'installation.

PostgreSQL dans Docker vous donne la liberté d'expérimenter sans craindre de casser votre installation locale. Vous pouvez facilement créer, modifier ou supprimer des instances de base de données, tester différentes versions de PostgreSQL et revenir à un état propre chaque fois que cela est nécessaire.

Dans ce guide, je vais vous expliquer tout ce que vous devez savoir sur l'exécution de PostgreSQL dans des conteneurs Docker pour une expérience de développement fluide.

>Je n'ai pas beaucoup d'expérience avec PostgreSQL ? Notre cours d'introduction pour les débutants vous couvre.

Pourquoi utiliser PostgreSQL dans Docker ?

Avant Docker, la mise en place d'une base de données impliquait souvent de suivre de longs guides d'installation, de résoudre des problèmes spécifiques au système et de gérer soigneusement les dépendances du système. Docker change complètement ce paradigme.

>Qu'est-ce qu'une base de données PostgreSQL etyway ? Découvrez son fonctionnement, les cas d'utilisation les plus courants et les ressources disponibles.

Avantages de l'exécution de PostgreSQL dans Docker

Docker vous offre un moyen élégant d'exécuter les bases de données PostgreSQL. Elle offre quelques avantages évidents par rapport aux méthodes d'installation traditionnelles :

  • Installation et configuration simplifiées : Avec Docker, vous pouvez lancer une instance PostgreSQL en une seule commande. Plus besoin de gérer des gestionnaires de paquets, des dépendances système ou des scripts d'installation compliqués. La base de données est préconfigurée avec des paramètres par défaut judicieux et est prête à être utilisée immédiatement.
  • Des environnements cohérents au sein des équipes : Tous les membres de votre équipe bénéficient exactement de la même configuration PostgreSQL, quel que soit leur système d'exploitation. Cela élimine le problème du "ça marche sur ma machine" qui est courant dans les équipes de développement.
  • Isolation des autres composants du système : Les conteneurs Docker fonctionnent en isolation, ce qui signifie que votre instance PostgreSQL n'interférera pas avec d'autres logiciels sur votre machine. Vous pouvez utiliser plusieurs versions de PostgreSQL en même temps sans conflit, et la suppression de PostgreSQL est aussi simple que l'arrêt et la suppression du conteneur.
  • Contrôle de version pour votre environnement de base de données : Docker vous permet de spécifier les versions exactes de PostgreSQL dans vos fichiers de configuration. Cela signifie que vous pouvez vous assurer que les environnements de développement correspondent exactement à la production et que vous pouvez tester les mises à niveau de manière isolée avant de les appliquer aux systèmes de production.
  • Efficacité des ressources : Les conteneurs Docker sont légers par rapport aux machines virtuelles. Ils utilisent moins de ressources système et offrent des avantages similaires en matière d'isolation. Cela signifie que vous pouvez exécuter PostgreSQL en même temps que d'autres conteneurs sans que cela ait un impact significatif sur les performances du système.

Quand utiliser PostgreSQL dans Docker ?

Après avoir travaillé pendant des années avec des bases de données dans des environnements conteneurisés, je peux affirmer sans me tromper qu'ils offrent d'innombrables avantages par rapport aux installations traditionnelles.

Par souci de commodité, je n'en citerai que quelques-uns :

  • Environnements de développement local : Pour les développeurs qui travaillent sur des applications utilisant PostgreSQL, Docker offre un moyen rapide de démarrer sans modifier leur système local. Vous pouvez facilement faire correspondre la version et la configuration exactes de la base de données utilisée en production, ce qui garantit que le code qui fonctionne localement fonctionnera également lors du déploiement.
  • Architecture microservices : Si vous créez des applications à l'aide de microservices, Docker permet à chaque service d'avoir sa propre instance de base de données si nécessaire. Cela permet une meilleure isolation entre les services et permet aux équipes de gérer les dépendances de leur base de données de manière indépendante.
  • Pipelines CI/CD et tests automatisés : Docker facilite la création de nouvelles instances de base de données pour l'exécution des tests. Chaque test peut commencer avec une base de données propre, ce qui améliore la fiabilité des tests. 
  • Développement de scripts de migration de bases de données : Docker offre un environnement sûr pour tester les migrations de bases de données. Vous pouvez vérifier vos scripts de migration à l'aide d'une base de données jetable correspondant à votre environnement de production avant de les appliquer à des systèmes réels.
  • Déploiements Kubernetes : Si vous utilisez Kubernetes pour l'orchestration, l'exécution de PostgreSQL dans Docker est une évidence. Votre environnement de développement local peut correspondre étroitement à votre configuration Kubernetes de production, ce qui rend le flux de travail du développement à la production transparent.

En résumé, PostgreSQL Dockerisé est utile pour le développement et les tests, mais il convient de noter que la gestion des déploiements de bases de données de production nécessite des considérations supplémentaires concernant la persistance des données, les sauvegardes et la haute disponibilité..

Je reviendrai sur certaines de ces considérations dans les sections suivantes de cet article.

Maîtriser Docker et Kubernetes

Apprenez la puissance de Docker et Kubernetes avec un cursus interactif pour construire et déployer des applications dans des environnements modernes.
Démarrer le cursus gratuitement

Configurer PostgreSQL dans Docker

La seule chose dont vous aurez besoin pour exécuter la base de données Postgres dans Docker est le moteur Docker lui-même.

Dans cette section, je vais vous guider à travers le processus de couverture des prérequis et d'exécution d'une base de données PostgreSQL entièrement fonctionnelle dans un conteneur Docker.

Conditions préalables

Avant de commencer à utiliser PostgreSQL dans Docker, vous aurez besoin de Docker installé sur votre système.

L'installation varie selon le système d'exploitation. Les utilisateurs de Windows et de macOS peuvent simplement installer DockerDesktop, qui est une interface graphique facile à utiliser pour gérer les conteneurs. Téléchargez-le depuis le site officiel de Docker.

Les utilisateurs de Linux peuvent installer Docker Engine directement à l'aide du gestionnaire de paquets de leur distribution. Par exemple, sur Ubuntu :

sudo apt update
sudo apt install docker.io
sudo systemctl enable --now docker

Outre l'installation de Docker, il est recommandé de se familiariser avec les commandes de terminal de base et les concepts de base de Docker, tels que les images, les conteneurs et les volumes. Ces guides pratiques de DataCamp sont là pour vous aider :

Extraction de l'image Docker PostgreSQL

Avant d'exécuter PostgreSQL, vous devez télécharger l'image Docker officielle de PostgreSQL depuis Docker Hub. Cette image sert de modèle pour la création de conteneurs.

Pour obtenir la dernière image de PostgreSQL, ouvrez votre terminal ou votre invite de commande et exécutez :

docker pull postgres

Cette commande télécharge la dernière version stable de PostgreSQL. Si vous avez besoin d'une version spécifique, vous pouvez la spécifier à l'aide d'une étiquette :

docker pull postgres:17

Image 1 - Extraction de la dernière version stable de l'image de la base de données PostgreSQL

Image 1 - Extraction de la dernière version stable de l'image de la base de données PostgreSQL

Les balises d'image PostgreSQL les plus utilisées sont les suivantes :

  • postgres:latest - La version stable la plus récente de PostgreSQL
  • postgres:17 - PostgreSQL version 14.x (le patch le plus récent de la version 17)
  • postgres:17.4 - Une version spécifique (17.4 dans ce cas).
  • postgres:bookworm - PostgreSQL est construit sur la distribution Linux Debian Bookworm.

Vous pouvez voir tous les tags disponibles sur la page officielle de PostgreSQL Docker Hub.

Exécuter PostgreSQL dans un conteneur Docker

Une fois que vous avez l'image PostgreSQL, vous pouvez créer et démarrer un conteneur avec une seule commande :

docker run --name postgres-db -e POSTGRES_PASSWORD=mypassword postgres

Image 2 - Démarrer un conteneur PostgreSQL

Image 2 - Démarrer un conteneur PostgreSQL

Cette commande crée un nouveau conteneur nommé postgres-db et définit une variable d'environnement pour le mot de passe PostgreSQL.

Cependant, cette commande de base a ses limites. Je vous recommande d'utiliser des options supplémentaires :

docker run --name postgres-db \
  -e POSTGRES_PASSWORD=mypassword \
  -e POSTGRES_USER=myuser \
  -e POSTGRES_DB=mydatabase \
  -p 5432:5432 \
  -v postgres-data:/var/lib/postgresql/data \
  -d postgres

Image 3 - Démarrage d'un conteneur PostgreSQL avec les variables env en mode détaché

Image 3 - Démarrage d'un conteneur PostgreSQL avec les variables env en mode détaché

Permettez-moi de détailler ces options supplémentaires :

  • Variables d'environnement :
    • POSTGRES_PASSWORD: Définit le mot de passe du superutilisateur PostgreSQL (obligatoire).
    • POSTGRES_USER: Crée un nouveau superutilisateur avec ce nom (la valeur par défaut est "postgres" si elle n'est pas spécifiée).
    • POSTGRES_DB: Crée une nouvelle base de données avec ce nom (le nom d'utilisateur est utilisé par défaut s'il n'est pas spécifié).
  • Le mappage de port (-p 5432:5432 ) fait correspondre le port PostgreSQL du conteneur (5432) au même port sur votre machine hôte, ce qui vous permet de vous connecter à PostgreSQL en utilisant localhost:5432.
  • Le montage de volume (-v postgres-data:/var/lib/postgresql/data ) crée un volume Docker nommé postgres-data qui conserve les fichiers de la base de données à l'extérieur du conteneur. Cela garantit que vos données ne sont pas perdues lorsque le conteneur s'arrête ou est retiré.
  • L'option -d permet de s'assurer que le conteneur fonctionne en mode détaché. En clair, cela signifie que le conteneur fonctionne en arrière-plan.

Vous pouvez vérifier que le conteneur fonctionne avec :

docker ps

Image 4 - Liste de tous les conteneurs en cours d'exécution

Image 4 - Liste de tous les conteneurs en cours d'exécution

Dans la section suivante, je vous montrerai comment configurer davantage votre conteneur PostgreSQL pour des cas d'utilisation spécifiques.

Configurer PostgreSQL dans Docker

La configuration de base que j'ai décrite dans la section précédente vous permettra de démarrer, mais pour tout ce qui est plus avancé, vous voudrez probablement personnaliser votre conteneur PostgreSQL.

C'est l'objet de cette section.

Mise en place d'un stockage persistant avec des volumes

L'un des aspects les plus importants de l'exécution d'une base de données dans Docker est de s'assurer que vos données persistent au-delà du cycle de vie du conteneur. Par défaut, toutes les données contenues dans un conteneur sont perdues lorsque le conteneur est supprimé. Pour une base de données, c'est rarement ce que vous souhaitez.

Les volumes Docker apportent une solution à ce problème en stockant les données en dehors du système de fichiers du conteneur.

Pour le mettre en place, commencez par créer un volume nommé :

docker volume create postgres-data

Vous pouvez éventuellement inspecter les détails du volume en exécutant la commande suivante :

docker volume inspect postgres-data

Image 5 - Liste des détails du volume

Image 5 - Liste des détails du volume

Maintenant, lorsque vous démarrez votre conteneur PostgreSQL, montez le volume dans le répertoire de données PostgreSQL :

docker run --name postgres-db \
  -e POSTGRES_PASSWORD=mysecretpassword \
  -v postgres-data:/var/lib/postgresql/data \
  -d postgres

Le paramètre -v postgres-data:/var/lib/postgresql/data relie le volume nommé au répertoire de données du conteneur.

En résumé, l'utilisation de volumes pour PostgreSQL présente les avantages suivants :

  • Vos données persistent même si vous retirez le conteneur.
  • Vous pouvez arrêter, démarrer ou mettre à niveau votre conteneur sans perdre de données.
  • Vous pouvez créer des sauvegardes de vos données en sauvegardant le volume.
  • Meilleures performances par rapport aux montages bind (en particulier sous macOS et Windows).

Exposer les ports pour se connecter à PostgreSQL

Pour vous connecter à votre base de données PostgreSQL à partir d'applications fonctionnant sur votre machine hôte, vous devez exposer le port PostgreSQL (5432) à votre système local.

L'approche la plus simple consiste à faire correspondre le port 5432 du conteneur au même port sur votre hôte :

docker run --name postgres-db \
  -e POSTGRES_PASSWORD=mysecretpassword \
  -p 5432:5432 \
  -d postgres

Le paramètre -p 5432:5432 fait correspondre le port 5432 du conteneur au port 5432 de votre machine hôte.

Si PostgreSQL ou un autre service utilise déjà le port 5432 sur votre hôte, vous pouvez l'affecter à un autre port :

docker run --name postgres-db \
  -e POSTGRES_PASSWORD=mysecretpassword \
  -p 5433:5432 \
  -d postgres

Maintenant, le port 5432 du conteneur est mappé au port 5433 de votre hôte. Lors de la connexion, vous devrez spécifier le port 5433 au lieu du port 5432 par défaut.

Par défaut, le port est exposé sur toutes les interfaces réseau (0.0.0.0). Vous pouvez éventuellement le restreindre à localhost pour plus de sécurité :

docker run --name postgres-db \
  -e POSTGRES_PASSWORD=mysecretpassword \
  -p 127.0.0.1:5432:5432 \
  -d postgres

Cela permet d'établir des connexions uniquement à partir de votre machine locale, et non à partir d'autres machines du réseau.

Configuration des paramètres de PostgreSQL

Vous pouvez modifier de nombreux paramètres par défaut de PostgreSQL lors de la création de votre conteneur. Une approche courante, mais pas la seule, consiste à utiliser des variables d'environnement.

Voici quelques variables que vous pouvez utiliser pour configurer la base de données :

docker run --name postgres-db \
  -e POSTGRES_PASSWORD=mysecretpassword \
  -e POSTGRES_USER=myuser \
  -e POSTGRES_DB=mydatabase \
  -e POSTGRES_INITDB_ARGS="--data-checksums" \
  -e POSTGRES_HOST_AUTH_METHOD=scram-sha-256 \
  -d postgres

Voici ce que fait chacun d'entre eux :

  • POSTGRES_PASSWORD: Définit le mot de passe du superutilisateur (obligatoire).
  • POSTGRES_USER: Définit le nom du superutilisateur (la valeur par défaut est "postgres").
  • POSTGRES_DB: Définit le nom par défaut de la base de données (par défaut le nom de l'utilisateur).
  • POSTGRES_INITDB_ARGS: Passe les arguments à la commande initdb de PostgreSQL.
  • POSTGRES_HOST_AUTH_METHOD: Définit la méthode d'authentification.

En plus des variables d'environnement, vous pouvez également personnaliser la configuration de PostgreSQL pour apporter des changements plus avancés à la configuration de la base de données.

Les paramètres de PostgreSQL les plus fréquemment personnalisés sont les suivants :

  • max_connections: Contrôle le nombre de connexions acceptées par PostgreSQL (la valeur par défaut est 100).
  • shared_buffers: Définit la mémoire utilisée pour la mise en cache (la valeur par défaut est souvent trop faible pour la production).
  • work_mem: Mémoire utilisée pour les opérations d'interrogation.
  • maintenance_work_mem: Mémoire utilisée pour les opérations de maintenance.

Pour une mise en œuvre pratique, commencez par créer un fichier, appelons-le my-postgres-conf:

max_connections = 200
shared_buffers = 1GB
work_mem = 16MB
maintenance_work_mem = 256MB

Maintenant, montez ce fichier lors de l'exécution du conteneur :

docker run --name postgres-db \
  -e POSTGRES_PASSWORD=mysecretpassword \
  -v ./my-postgres.conf:/etc/postgresql/postgresql.conf \
  -v postgres-data:/var/lib/postgresql/data \
  -d postgres \
  -c 'config_file=/etc/postgresql/postgresql.conf'

En bref, en configurant correctement la persistance, l'accès au réseau et les paramètres de PostgreSQL, vous pouvez créer un environnement PostgreSQL basé sur Docker qui fonctionne exactement comme vous le souhaitez. L'image de base postgres:latest n'est que cela - la base - et vous pouvez y apporter de nombreuses modifications.

Dans la section suivante, je vous montrerai comment vous connecter à la base de données PostgreSQL exécutée dans Docker.

Connexion à PostgreSQL exécuté dans Docker

Maintenant que votre conteneur PostgreSQL est opérationnel, l'étape suivante consiste à vous y connecter. Après tout, pour quelle autre raison géreriez-vous une base de données ?

Dans cette section, je vous montrerai deux façons de vous connecter à votre base de données PostgreSQL conteneurisée : en utilisant l'outil psql en ligne de commande et en utilisant une interface graphique.

Pour référence, je lance mon conteneur de base de données avec cette commande :

docker run --name postgres-db \
  -e POSTGRES_PASSWORD=mysecretpassword \
  -e POSTGRES_USER=myuser \
  -e POSTGRES_DB=mydatabase \
  -v postgres-data:/var/lib/postgresql/data \
  -p 5432:5432 \
  -d postgres

Connexion à l'aide de l'outil de ligne de commande psql

L'outil de ligne de commande psql est le client officiel de PostgreSQL qui vous permet d'interagir avec la base de données à l'aide de commandes SQL. 

Pour vous connecter à la base de données PostgreSQL fonctionnant dans le conteneur depuis votre machine hôte, exécutez la commande suivante, mais n'oubliez pas de mettre à jour les valeurs de l'utilisateur et de la base de données :

docker exec -it postgres-db psql -U myuser -d mydatabase

Image 6 - Connexion à la base de données Postgres à l'aide de psql

Image 6 - Connexion à la base de données Postgres à l'aide de psql

Et c'est tout !

Si vous n'êtes pas sûr de la fonction de cette commande, voici une explication simple :

  • docker exec -it postgres-db: Exécutez une commande interactive dans le conteneur nommé "postgres-db".
  • psql -U myuser -d mydatabase: Lancez psql, en vous connectant en tant que "myuser" à la base de données "mydatabase".

Si vous ne parvenez pas à vous connecter, vérifiez les points suivants :

  • Confirmez que le conteneur est en cours d'exécution à l'aide de docker ps.
  • Vérifiez le mappage des ports à l'aide de docker port postgres-db.

Connexion à l'aide d'un outil GUI

De nombreux développeurs préfèrent utiliser un outil graphique plutôt qu'un CLI - moi y compris. pgAdmin est un choix populaire et gratuit pour PostgreSQL, mais le processus de connexion est similaire pour d'autres outils comme DBeaver, DataGrip, ou TablePlus.

L'installation de pgAdmin est simple, je n'en parlerai donc pas ici.

Si vous l'avez installé et lancé, cliquez avec le bouton droit de la souris sur "Serveurs" dans le panneau du navigateur et sélectionnez "Enregistrer > Serveur". Dans l'onglet Général, donnez un nom à votre connexion :

Image 7 - Onglet général de pgAdmin

Image 7 - Onglet général de pgAdmin

Passez ensuite à l'onglet "Connexion" et entrez ces données :

  • Nom/adresse de l'hôte : localhost
  • Port : 5432 (ou tout autre port que vous avez mappé)
  • Base de données de maintenance : mydatabase
  • Nom d'utilisateur : myuser
  • Mot de passe : Votre mot de passe PostgreSQL

Image 8 - Onglet de connexion de pgAdmin

Image 8 - Onglet de connexion de pgAdmin

Enfin, cliquez sur "Enregistrer" pour vous connecter :

Image 9 - Connexion réussie

Image 9 - Connexion réussie

Une fois connecté, vous pouvez commencer à travailler avec votre base de données comme vous le feriez avec une instance PostgreSQL installée localement ou fournie dans le cloud. La beauté de Docker est que, du point de vue de votre application ou de votre client, il n'y a pas de différence - il s'agit simplement d'une base de données PostgreSQL accessible à l'adresse spécifiée.

>Vous avez besoin d'un accès programmatique à votre base de données PostgreSQL ? Découvrez comment y accéder à partir de Python.

Dans la section suivante, j'expliquerai comment gérer votre conteneur PostgreSQL, y compris l'arrêt, le démarrage et la surveillance.

Gérer PostgreSQL dans Docker

C'est une chose d'exécuter une base de données PostgreSQL dans un conteneur et de s'y connecter, mais la gestion est un tout autre animal. Heureusement pour vous, il existe une poignée de commandes à votre disposition.

Dans cette section, je couvrirai les opérations essentielles comme l'arrêt et le démarrage de votre conteneur, l'examen des journaux et la mise à jour de la version de PostgreSQL.

Arrêter, redémarrer et supprimer le conteneur PostgreSQL

Les outils en ligne de commande de Docker vous permettent de gérer le cycle de vie de votre conteneur PostgreSQL.

Pour arrêter un conteneur PostgreSQL en cours d'exécution, exécutez la commande suivante :

docker stop postgres-db

De même, exécutez la commande suivante lorsque vous devez le redémarrer :

docker start postgres-db

Image 10 - Arrêt et démarrage du conteneur

Image 10 - Arrêt et démarrage du conteneur

Si vous souhaitez redémarrer un conteneur en cours d'exécution, ce qui peut être utile après avoir modifié certaines configurations, exécutez la commande suivante :

docker restart postgres-db

Dans les cas où vous avez complètement terminé avec un conteneur et que vous souhaitez le supprimerne cherchez pas plus loin que ces deux commandes :

docker stop postgres-db
docker rm postgres-db

N'oubliez pas que la suppression d'un conteneur ne supprime pas vos données si vous avez configuré un volume correctement. Vos données se trouvent toujours dans le volume postgres-data créé précédemment.

Vous pouvez vérifier que le conteneur a été supprimé en exécutant le programme :

docker ps -a

Le drapeau -a affiche tous les conteneurs, y compris ceux qui sont à l'arrêt. Si votre conteneur a été retiré avec succès, il n'apparaîtra pas dans cette liste :

Image 11 - Liste de tous les conteneurs

Image 11 - Liste de tous les conteneurs

Inspection des registres

Lorsque quelque chose ne va pas ou que vous souhaitez contrôler l'activité de votre base de données, la vérification des journaux est une bonne première étape.

Exécutez cette commande pour afficher les journaux de votre conteneur PostgreSQL :

docker logs postgres-db

Il affiche tous les journaux depuis le démarrage du conteneur. Pour un grand nombre de journaux, vous pouvez vouloir limiter la sortie, par exemple, aux 50 derniers journaux :

docker logs --tail 50 postgres-db

Image 12 - Visualisation des journaux des conteneurs

Image 12 - Visualisation des journaux des conteneurs

En revanche, si vous souhaitez suivre les logs en temps réelc'est cette commande que vous devez exécuter :

docker logs -f postgres-db

Image 13 - Visualisation des journaux de conteneurs en temps réel

Image 13 - Visualisation des journaux de conteneurs en temps réel

Cette fonction est particulièrement utile pour déboguer les problèmes de connexion ou pour observer l'activité de la base de données pendant le développement.

Appuyez sur Ctrl+C/CMD+C pour arrêter de suivre les journaux.

Mise à jour de PostgreSQL dans Docker

Au fil du temps, vous voudrez mettre à jour votre version de PostgreSQL pour bénéficier des dernières fonctionnalités, des améliorations de performance et des correctifs de sécurité.

Au moment de la rédaction du présent document, postgres:17.4 est la dernière version, mais supposons théoriquement que postgres:17.5 ait été publié. Cette section vous montrera comment mettre à jour la version de la base de données dans votre conteneur.

Pour commencer, téléchargez la dernière image de PostgreSQL (ou une version spécifique) :

docker pull postgres:17.5

Ensuite, arrêtez et retirez le conteneur existant :

docker stop postgres-db
docker rm postgres-db

Enfin, créez un nouveau conteneur avec le même volume :

docker run --name postgres-db \
  -e POSTGRES_PASSWORD=mysecretpassword \
  -e POSTGRES_USER=myuser \
  -e POSTGRES_DB=mydatabase \
  -v postgres-data:/var/lib/postgresql/data \
  -p 5432:5432 \
  -d postgres:17.5

Puisque vous utilisez le même volume (postgres-data), toutes vos données existantes seront préservées.

Si vous mettez à jour vers une nouvelle version majeure (comme 17 vers 18), PostgreSQL exécutera automatiquement toutes les migrations de données nécessaires lorsqu'il démarrera. Gardez ces éléments à l'esprit :

  • Les mises à niveau de versions majeures doivent d'abord être testées dans un environnement de non-production.
  • Sauvegardez toujours votre volume de données avant une mise à jour majeure.
  • Consultez les notes de mise à jour de PostgreSQL pour connaître les changements les plus récents.

Pour créer une sauvegarde avant la mise à niveauexécutez la commande suivante :

docker run --rm -v postgres-data:/data -v $(pwd):/backup postgres:17.4 \
  bash -c "pg_dumpall -U myuser > /backup/postgres_backup.sql"

Cette opération crée un fichier de sauvegarde SQL dans votre répertoire actuel, que vous pouvez utiliser pour restaurer vos données en cas de problème.

>Vous trouverez peut-être notre aide-mémoire sur les bases de PostgreSQL hVous trouverez peut-être notre aide-mémoire sur les bases de PostgreSQL utile comme référence rapide lorsque vous travaillez avec Docker.

Dans la section suivante, j'aborderai les meilleures pratiques pour l'utilisation de PostgreSQL dans Docker, y compris les considérations de sécurité et les conseils d'optimisation.

Meilleures pratiques pour l'utilisation de PostgreSQL dans Docker

La flexibilité de Docker s'accompagne de responsabilités. Dans cette section, je vais partager les meilleures pratiques pour s'assurer que votre installation PostgreSQL conteneurisée est fiable, sécurisée et suit les standards de l'industrie.

Protégez vos données grâce à des sauvegardes régulières

Quelle que soit la façon dont vous utilisez PostgreSQL, des sauvegardes régulières sont indispensables. J'ai parlé des sauvegardes dans la section précédente, mais c'est ici que je vais passer à la vitesse supérieure. 

La façon la plus simple de sauvegarder une base de données PostgreSQL fonctionnant dans Docker est d'utiliser pg_dump:

docker exec -t postgres-db pg_dump -U myuser mydatabase > backup.sql

Image 14 - Sauvegarde PostgreSQL

Image 14 - Sauvegarde PostgreSQL

Pour une sauvegarde complète de toutes les bases de données, y compris les rôles et les tablespaces, utilisez pg_dumpall:

docker exec -t postgres-db pg_dumpall -U myuser > full_backup.sql

Image 15 - Sauvegarde complète de la base de données PostgreSQL

Image 15 - Sauvegarde complète de la base de données PostgreSQL

Cette image ne montre que quelques commandes de sauvegarde, car il n'est pas possible d'afficher l'ensemble à l'écran.

Pour automatiser vos sauvegardesvous pouvez créer un simple script shell et l'exécuter avec cron :

#!/bin/bash
# backup.sh
TIMESTAMP=$(date +"%Y%m%d")
BACKUP_DIR="/Users/dradecic/Documents/pg-backups"

# Make sure the backup directory exists
mkdir -p $BACKUP_DIR

# Create the backup
docker exec postgres-db pg_dumpall -U myuser | gzip > $BACKUP_DIR/postgres_$TIMESTAMP.sql.gz

# Remove backups older than 30 days
find $BACKUP_DIR -name "postgres_*.sql.gz" -mtime +30 -delete

Rendez le script exécutable et exécutez-le :

chmod +x backup.sh

bash backup.sh

Image 16 - Exécution d'un script de sauvegarde de la base de données PostgreSQL

Image 16 - Exécution d'un script de sauvegarde de la base de données PostgreSQL

Pour automatiser complètement la sauvegarde, vous pouvez ajouter le script à votre crontab pour qu'il soit exécuté quotidiennement :

0 3 * * * /path/to/backup.sh

Ce programme exécute la sauvegarde tous les jours à 3 heures du matin, mais vous pouvez bien sûr ajuster l'heure et la fréquence en fonction de vos besoins. 

>Consultez mon fue mon guide complet sur les jobs cron pour pour en savoir plus sur cet outil d'automatisation très utile.

Pour les environnements de production, envisagez de stocker les sauvegardes hors site ou dans le cloud pour la reprise après sinistre..

Utiliser des volumes nommés pour la persistance des données

Bien que j'aie abordé brièvement les volumes précédemment, il est utile de les examiner plus en profondeur.

En règle générale, vous nedevriez jamais exécuter PostgreSQL dans Docker sans un volume correctement configuré. Si vous le faites, vos données seront perdues lorsque le conteneur sera supprimé ou lorsque Docker effectuera des opérations de nettoyage.

L'utilisation de volumes nommés (plutôt que de volumes anonymes) facilite la sauvegarde et la gestion des données :

# Create a named volume
docker volume create postgres-data

# Use it when running the container
docker run --name postgres-db \
  -e POSTGRES_PASSWORD=mysecretpassword \
  -v postgres-data:/var/lib/postgresql/data \
  -d postgres

Il n'y a rien de nouveau.

Les volumes nommés sont également plus faciles à sauvegarder. Pour créer une sauvegarde de l'ensemble du volume, exécutez la commande suivante :

docker run --rm -v postgres-data:/data -v $(pwd):/backup alpine tar czf /backup/postgres-data-backup.tar.gz /data

Cela créera un fichier postgres-data-backup.tar.gz dans le même dossier que celui à partir duquel vous avez exécuté la commande.

Pour restaurer ce volume, exécutez la commande suivante :

docker run --rm -v postgres-data:/data -v $(pwd):/backup alpine sh -c "cd /data && tar xzf /backup/postgres-data-backup.tar.gz --strip 1"

C'est tout !

Sécuriser PostgreSQL dans Docker

Lorsqu'il s'agit de bases de données, la sécurité ne doit jamais être négligée. Cette sous-section vous guidera à travers quelques pratiques essentielles pour sécuriser votre conteneur PostgreSQL.

Utilisez des mots de passe forts et uniques

Évitez les mots de passe par défaut ou faibles. Générer un mot de passe fort et aléatoire pour votre superutilisateur PostgreSQL :

export POSTGRES_PASSWORD=$(openssl rand -base64 32)
echo "$POSTGRES_PASSWORD" > postgres-password.txt

docker run --name postgres-db \
  -e POSTGRES_PASSWORD="$POSTGRES_PASSWORD" \
  -v postgres-data:/var/lib/postgresql/data \
  -d postgres

Image 17 - Utiliser un mot de passe sécurisé

Image 17 - Utiliser un mot de passe sécurisé

Conservez ce mot de passe en toute sécurité, par exemple dans un gestionnaire de mots de passe ou dans un fichier de variables d'environnement qui n'est pas soumis au contrôle de version.

Restreindre l'accès au réseau

Par défaut, Docker expose le port PostgreSQL sur toutes les interfaces. Pour une meilleure sécurité, en particulier en production, limitez l'accès à localhost :

docker run --name postgres-db \
  -e POSTGRES_PASSWORD=mysecretpassword \
  -p 127.0.0.1:5432:5432 \
  -v postgres-data:/var/lib/postgresql/data \
  -d postgres

Utiliser la configuration personnalisée de PostgreSQL

Créez une configuration PostgreSQL plus sûre en modifiant des paramètres tels que ceux ci-dessous :

# Require SSL
ssl = on
ssl_cert_file = '/etc/ssl/certs/ssl-cert-snakeoil.pem'
ssl_key_file = '/etc/ssl/private/ssl-cert-snakeoil.key'

# Limit connection attempts
max_connections = 100
authentication_timeout = 1min

# Restrict access
listen_addresses = 'localhost'

Montez ce fichier de configuration lors du démarrage de votre conteneur :

docker run --name postgres-db \
  -e POSTGRES_PASSWORD=mysecretpassword \
  -v ./pg_hba.conf:/var/lib/postgresql/data/pg_hba.conf \
  -v ./postgresql.conf:/var/lib/postgresql/data/postgresql.conf \
  -v postgres-data:/var/lib/postgresql/data \
  -d postgres

Mettez régulièrement à jour votre image PostgreSQL

Maintenez votre version de PostgreSQL à jour pour bénéficier des derniers correctifs de sécurité :

docker pull postgres:latest
docker stop postgres-db
docker rm postgres-db
# Then recreate with the latest image

Ces bonnes pratiques vous permettront de créer un environnement PostgreSQL plus fiable et plus sûr dans Docker, adapté à la fois au développement et à la production.

Dans la section suivante, j'expliquerai comment résoudre les problèmes courants que vous pouvez rencontrer lorsque vous exécutez PostgreSQL dans Docker.

Dépannage de PostgreSQL dans Docker

Tôt ou tard, vous rencontrerez des problèmes lors de l'exécution de PostgreSQL dans Docker. Dans cette section, j'aborderai les problèmes courants et leurs solutions, ce qui vous permettra de gagner du temps et d'éviter des frustrations en cours de route.

Problèmes courants avec les conteneurs PostgreSQL

Un problème courant auquel sont confrontés de nombreux utilisateurs est que leur conteneur s'arrête immédiatement après le démarrage de. Si c'est le cas, vérifiez les journaux pour identifier le problème :

docker logs postgres-db

Votre erreur peut être liée à des problèmes d'autorisation avec les volumes montés. Si c'est le cas, vous verrez un message similaire :

initdb: could not change permissions of directory "/var/lib/postgresql/data": Operation not permitted

Pour résoudre ce problème, vérifiez la propriété et les autorisations de votre volume et corrigez-les si nécessaire :

# Check the ownership
docker run --rm -v postgres-data:/data alpine ls -la /data

# Fix the permissions
docker run --rm -v postgres-data:/data alpine chmod 700 /data

Un autre problème courant est l'absence de variables d'environnement requises. Un message typique du journal lorsque cela se produit ressemble à ceci :

Database is uninitialized and superuser password is not specified

Pour résoudre ce problème, assurez-vous que vous définissez la variable d'environnement POSTGRES_PASSWORD requise - ou toute autre variable d'environnement d'ailleurs :

docker run --name postgres-db \
  -e POSTGRES_PASSWORD=mysecretpassword \
  -v postgres-data:/var/lib/postgresql/data \
  -d postgres

L'erreur "Data directory not empty but missing PostgreSQL files" est également fréquente. Voici le message que vous verrez probablement :

PostgreSQL Database directory appears to contain a database; Skipping initialization

Suivi d'erreurs concernant des fichiers manquants.

Cela se produit généralement lorsque vous avez monté un volume qui contient des fichiers mais pas de base de données PostgreSQL valide. Il se peut que vous deviez réinitialiser le système en utilisant un nouveau volume :

docker volume create postgres-data-new
docker run --name postgres-db \
  -e POSTGRES_PASSWORD=mysecretpassword \
  -v postgres-data-new:/var/lib/postgresql/data \
  -d postgres

Résoudre les problèmes de connectivité

Si vous ne pouvez pas vous connecter à votre base de données PostgreSQL fonctionnant dans un conteneur, commencez par en confirmant que le conteneur est en cours d'exécution:

docker ps | grep postgres-db

S'il ne figure pas dans la liste, il se peut qu'il se soit écrasé. Vérifiez les journaux comme décrit précédemment.

S'il figure dans la liste mais que vous ne parvenez toujours pas à vous connecter, vérifiez le mappage des ports:

docker port postgres-db

Vous devriez voir quelque chose comme ceci :

Image 18 - Cartographie des ports à conteneurs

Image 18 - Cartographie des ports à conteneurs

Si ce n'est pas le cas, il se peut que le mappage de votre port soit incorrect. Recréez le conteneur avec l'option -p appropriée.

Si vous ne pouvez toujours pas vous connecter à la base de données, il est temps de vérifier vos paramètres de connexion. Vérifiez ces paramètres :

  • Nom d'hôte : localhost ou 127.0.0.1 (pas le nom du conteneur).
  • Port : Le port hôte de votre mappage (généralement 5432).
  • Nom d'utilisateur : La valeur de POSTGRES_USER (la valeur par défaut est "postgres").
  • Mot de passe : La valeur de POSTGRES_PASSWORD.
  • Base de données : La valeur de POSTGRES_DB (la valeur par défaut est la même que celle de POSTGRES_USER).

Réessayez après avoir traité ces questions. Si le problème persiste, vous devez tester la connectivité à l'intérieur du conteneur :

docker exec -it postgres-db psql -U postgres

Si cela fonctionne, le problème se situe au niveau du mappage des ports ou du réseau externe.

Enfin, vous pouvez vérifier les problèmes de pare-feu à l'adresse. Il se peut que le pare-feu de votre système bloque les connexions au port PostgreSQL :

# Linux
sudo iptables -L | grep 5432

# macOS
sudo pfctl -sr | grep 5432

En vérifiant ces problèmes courants, vous devriez être en mesure d'identifier et de résoudre la plupart des problèmes liés à PostgreSQL dans Docker. Si vous êtes toujours bloqué, la documentation et les forums de la communauté PostgreSQL et Docker sont d'excellentes ressources pour un dépannage plus spécifique.

Résumé de la base de données PostgreSQL dans Docker

Et voilà, le guide ultime pour configurer et exécuter les bases de données PostgreSQL dans Docker ! J'ai couvert tout ce que vous devez savoir pour commencer, de la mise en place de votre premier conteneur à la configuration, la connexion et la gestion de votre base de données. 

Les options traditionnelles de PostgreSQL, telles que l'installation de la base de données en local ou son provisionnement dans le cloud, sont soit sous-optimales, soit coûteuses à des fins de développement. Docker comble cette lacune. Que vous l'utilisiez pour le développement local, les tests ou même les environnements de production, PostgreSQL conteneurisé offre une flexibilité et une cohérence difficilement égalables.

Vous êtes maintenant plus que prêt à intégrer la base de données Postgres dockerisée dans vos applications.

Si vous souhaitez plonger plus profondément, je vous recommande ces cours de DataCamp :

FAQ

Pourquoi devrais-je exécuter PostgreSQL dans Docker au lieu d'une installation traditionnelle ?

L'utilisation de PostgreSQL dans Docker offre une installation simplifiée, des environnements cohérents sur différentes machines et une isolation des autres composants du système. Il vous permet d'exécuter simultanément plusieurs versions de PostgreSQL sans conflit, facilite la mise à niveau et la rétrogradation, et permet une installation et un démontage rapides pour le développement et les tests. Les conteneurs Docker utilisent également moins de ressources système que les machines virtuelles.

Comment se connecter à une base de données PostgreSQL exécutée dans Docker ?

Vous pouvez vous connecter à une base de données PostgreSQL fonctionnant dans Docker en utilisant la commande docker exec -it postgres-db psql -U myuser -d mydatabase pour accéder à l'outil de ligne de commande psql directement dans le conteneur. Vous pouvez également utiliser des outils GUI comme pgAdmin, DBeaver ou TablePlus en vous connectant à localhost (ou 127.0.0.1) sur le port que vous avez mappé (généralement 5432) avec votre nom d'utilisateur et votre mot de passe configurés.

Qu'advient-il de mes données PostgreSQL lorsque je supprime un conteneur Docker ?

Lorsque vous supprimez un conteneur Docker, toutes les données stockées à l'intérieur du conteneur sont perdues, à moins que vous n'ayez configuré un volume. En utilisant des volumes nommés (comme docker volume create postgres-data), les données de votre base de données sont conservées en dehors du système de fichiers du conteneur. Cela signifie que vous pouvez arrêter, supprimer ou mettre à jour votre conteneur PostgreSQL en toute sécurité sans perdre vos données, tant que vous montez le même volume lors de la création d'un nouveau conteneur.

Comment sauvegarder ma base de données PostgreSQL exécutée dans Docker ?

Pour sauvegarder une base de données PostgreSQL fonctionnant dans Docker, vous pouvez utiliser la commande pg_dump avec : docker exec -t postgres-db pg_dump -U myuser mydatabase > backup.sql. Pour une sauvegarde complète incluant toutes les bases de données et tous les rôles, utilisez plutôt pg_dumpall. Vous pouvez automatiser les sauvegardes à l'aide d'un script shell avec des tâches cron qui s'exécutent à intervalles programmés et incluent des fonctionnalités telles que la compression et la rotation des anciennes sauvegardes.


Dario Radečić's photo
Author
Dario Radečić
LinkedIn
Scientifique de données senior basé en Croatie. Rédacteur technique de premier plan avec plus de 700 articles publiés, générant plus de 10 millions de vues. Auteur du livre Machine Learning Automation with TPOT.
Sujets

Apprenez-en plus sur Docker avec ces cours !

Cursus

Containerization and Virtualization with Docker and Kubernetes

0 min
Learn the power of Docker and Kubernetes, this interactive track will allow you to build and deploy applications in modern environments.
Afficher les détailsRight Arrow
Commencer le cours
Voir plusRight Arrow