PostgreSQL, également appelé Postgres, est le principal système de base de données relationnelle objet. Il est populaire en raison de son haut niveau de conformité avec la norme SQL et de l'inclusion de fonctionnalités supplémentaires qui simplifient le travail avec des ensembles de données complexes à grande échelle.
PostgreSQL utilise une architecture client-serveur traditionnelle, vous devez donc l'exécuter indépendamment du code de votre application. Dans ce guide, vous allez déployer une instance de serveur PostgreSQL en tant que conteneur Docker. Cela évite d'ajouter des packages à votre machine hôte et aide à isoler votre base de données des autres parties de votre pile. Assurez-vous que Docker est installé avant de continuer.
Mise en route
PostgreSQL a une image officielle sur Docker Hub qui est disponible en plusieurs variantes différentes. Les balises vous permettent de choisir entre les principales versions de PostgreSQL de la v9 à la v14 et de choisir le système d'exploitation utilisé comme image de base. Alpine, Debian Stretch et Debian Bullseye sont proposés.
Pour les besoins de ce tutoriel, nous utiliserons le postgres:14
balise qui fournit PostgreSQL 14 au-dessus de Bullseye. Vous êtes libre de sélectionner une version différente en fonction de vos besoins.
Démarrez un conteneur PostgreSQL à l'aide de docker run
commande :
docker run -d --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=<password> -v postgres:/var/lib/postgresql/data postgres:14
Vous devez fournir une valeur pour le POSTGRES_PASSWORD
variables d'environnement. Ceci définit le mot de passe qui sera attribué au compte superutilisateur par défaut de Postgres. Le nom d'utilisateur par défaut est postgres
mais peut être modifié en définissant le POSTGRES_USER
variable d'environnement.
Le -v
flag est utilisé pour monter un volume Docker dans le répertoire de données du conteneur PostgreSQL. Un volume nommé appelé postgres
est référencé ; Docker le créera ou rattachera le volume s'il existe déjà. Vous devez utiliser un volume pour stocker votre base de données en dehors du conteneur. Sans celui-ci, vous utiliserez vos données lorsque le conteneur s'arrêtera.
PostgreSQL écoute sur le port 5432 par défaut. Le port de conteneur est lié au port 5432 sur votre hôte Docker par le -p
drapeau. Le -d
flag est utilisé pour démarrer le conteneur en mode détaché, ce qui en fait un service d'arrière-plan qui continue de fonctionner jusqu'à ce qu'il soit arrêté avec docker stop
.
Fournir le mot de passe sous forme de fichier
Si vous n'êtes pas à l'aise de fournir votre mot de passe de superutilisateur sous forme d'indicateur CLI en texte brut, vous pouvez l'injecter sous forme de fichier via un volume à la place. Vous devez ensuite définir le POSTGRES_PASSWORD_FILE
variable d'environnement pour donner à Postgres le chemin d'accès à ce fichier :
docker run -d --name postgres -p 5432:5432 -e POSTGRES_PASSWORD_FILE=/run/secrets/postgres-password -v ./postgres-password.txt:/run/secrets/postgres-password -v postgres:/var/lib/postgresql/data postgres:14
Cette technique fonctionne également pour POSTGRES_USER
et d'autres variables d'environnement prises en charge.
Connexion à votre base de données
Comme PostgreSQL était lié au port 5432 ci-dessus, vous pouvez vous connecter à votre base de données sur localhost:5432
depuis n'importe quel client compatible. Utilisez les informations d'identification que vous avez attribuées en tant que variables d'environnement lors du démarrage du conteneur.
L'image Docker inclut également le psql
binaire que vous pouvez invoquer avec docker exec
. Utilisez-le pour interagir rapidement avec votre base de données à partir d'un shell PostgreSQL dans le conteneur.
docker exec -it postgres psql -U postgres
Connexion à partir d'autres conteneurs Docker
La création d'un réseau Docker est le moyen privilégié pour accéder à PostgreSQL à partir d'autres conteneurs sur le même hôte. Cela évite de lier le port du serveur Postgres et d'exposer potentiellement le service au réseau plus large de votre hôte.
Créer un réseau Docker :
docker network create my-app
Démarrez votre conteneur Postgres avec une connexion au réseau en utilisant le --network
drapeau avec docker run
:
docker run -d --name postgres --network my-app -e POSTGRES_PASSWORD=<password> -v postgres:/var/lib/postgresql/data postgres:14
Joignez maintenant votre conteneur d'applications au même réseau :
docker run -d --name api --network my-app my-api:latest
Les conteneurs du réseau peuvent atteindre Postgres en utilisant le postgres
nom d'hôte, car il s'agit du name
affecté au conteneur Postgres. Utilisez le port 5432 pour terminer la connexion.
Configurer PostgreSQL
Vous pouvez passer les options du serveur PostgreSQL en utilisant -c
drapeaux après le nom de l'image dans votre docker run
commande :
docker run -d --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=<password> -v postgres:/var/lib/postgresql/data postgres:14 -c max_connections=100
Tout ce qui suit le nom de l'image est transmis à la commande démarrée dans le conteneur. Cette commande sera le binaire du serveur PostgreSQL dans le cas de l'image Postgres.
Vous pouvez utiliser un fichier de configuration personnalisé lorsque vous définissez les valeurs de plusieurs options. Vous devrez utiliser un autre volume Docker pour monter votre fichier dans le conteneur, puis fournir un -c
flag pour indiquer à Postgres où chercher :
docker run -d --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=<password> -v ./postgres.conf:/etc/postgresql/postgresql.conf -v postgres:/var/lib/postgresql/data postgres:14 -c config_file=/etc/postgresql/postgresql.conf
Cet exemple utilise un montage de liaison Docker pour obtenir le postgres.conf
fichier dans votre répertoire de travail monté dans le conteneur /etc/postgresql
annuaire. Pour une référence des options que vous pouvez définir avec des drapeaux binaires ou des directives de fichier de configuration, reportez-vous à la documentation PostgreSQL.
Amorçage de la base de données
L'image Docker prend en charge les fichiers de départ placés dans /docker-entrypoint-initdb.d
annuaire. Tout .sql
ou .sql.gz
les fichiers seront exécutés pour initialiser la base de données. Cela se produit après le compte d'utilisateur par défaut et postgres
base de données ont été créées. Vous pouvez également ajouter .sh
fichiers pour exécuter des scripts shell arbitraires. Tous les scripts sont exécutés dans l'ordre alphabétique.
Ce mécanisme signifie que tout ce dont vous avez besoin pour amorcer votre base de données est un ensemble de scripts SQL ou shell nommés dans l'ordre séquentiel correct. Montez-les dans votre nouveau conteneur en utilisant un -v
drapeau avec docker run
:
docker run -d --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=<password> -v ./db-seed-files/:/etc/docker-entrypoint-initdb.d -v postgres:/var/lib/postgresql/data postgres:14
Les scripts d'initialisation ne seront utilisés que lorsque le répertoire de données Postgres est vide. Pour des raisons pratiques, cela signifie qu'ils s'exécuteront la première fois que le conteneur démarre avec un nouveau volume vide attaché.
Création d'une image de base de données personnalisée
Vous pouvez choisir d'encapsuler votre fichier de configuration et vos scripts d'initialisation dans votre propre image Docker. Cela permettrait à toute personne ayant accès à l'image de créer une nouvelle instance PostgreSQL préconfigurée pour votre application. Voici un Dockerfile simple que vous pourriez utiliser :
FROM postgres:14 COPY postgres.conf /etc/postgresql/postgresql.conf COPY db-seed-files/ /etc/docker-entrypoint-initdb.d/ CMD ["-c", "config_file=/etc/postgresql/postgresql.conf"]
Créez votre image personnalisée :
docker build -t custom-postgres:latest .
Les instructions de construction dans le Dockerfile copient le fichier de configuration PostgreSQL et les scripts d'initialisation de votre répertoire de travail et les intègrent dans l'image du conteneur. Vous pouvez désormais démarrer un conteneur de base de données sans fournir manuellement les ressources :
docker run -d --name custom-postgres -p 5432:5432 -e POSTGRES_PASSWORD=<password> -v postgres:/var/lib/postgresql/data custom-postgres:latest
Devez-vous conteneuriser votre base de données de production ?
Il peut être difficile de décider s'il faut exécuter une base de données dans Docker. La conteneurisation de PostgreSQL facilite la configuration, mais est parfois plus difficile à maintenir. Vous devez faire attention lors de la gestion de votre conteneur pour éviter la perte de données à l'avenir. Docker ajoute également une surcharge de performances modeste qui mérite d'être prise en compte lorsque vous prévoyez que la base de données de tournée fonctionnera avec de très gros volumes de données.
Les avantages de Docker sont une portabilité accrue, une facilité de mise à l'échelle et l'efficacité des développeurs. La conteneurisation de votre base de données permet à quiconque de lancer une nouvelle instance à l'aide de Docker, sans installer et configurer manuellement PostgreSQL au préalable. L'écriture d'un Dockerfile pour votre base de données PostgreSQL qui ajoute votre fichier de configuration et vos scripts de démarrage SQL est donc un bon moyen d'aider les développeurs à démarrer rapidement de nouveaux environnements.
Résumé
PostgreSQL est un moteur de base de données avancé basé sur SQL qui ajoute des capacités relationnelles objet. Bien que vous puissiez choisir d'exécuter un déploiement traditionnel en production, l'utilisation d'une instance conteneurisée simplifie la configuration et aide les développeurs à développer rapidement leur propre infrastructure.
L'aspect le plus critique d'un déploiement Dockerisé est de s'assurer que vous utilisez un volume pour stocker vos données. Cela vous permettra d'arrêter, de remplacer et de mettre à jour votre conteneur vers une version d'image ultérieure sans perdre votre base de données. Au-delà du stockage, vous devez évaluer comment vous allez vous connecter à Postgres et éviter de lier les ports à votre hôte, sauf si nécessaire. Lorsque vous vous connectez depuis un autre conteneur, il est préférable d'utiliser un réseau Docker partagé pour faciliter l'accès.