GNU/Linux >> Tutoriels Linux >  >> Panels >> Docker

Comment déployer PostgreSQL en tant que conteneur Docker

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.


Docker
  1. Comment installer WordPress avec Docker

  2. Comment installer Docker et déployer une pile LAMP

  3. Comment exécuter MySQL dans un conteneur Docker

  4. Comment attribuer une adresse IP statique à un conteneur Docker

  5. Comment répertorier les conteneurs Docker

Comment exécuter Grafana dans un conteneur Docker

Comment déployer un conteneur Docker sur AWS Elastic Beanstalk

Comment déployer et gérer un conteneur Docker MongoDB

Comment configurer un conteneur Apache Docker

Comment exécuter des conteneurs Docker

Comment déployer un conteneur Docker sur Jelastic Cloud