Exécution de PostgreSQL à l'aide de Docker Compose

Exécution de PostgreSQL à l'aide de Docker Compose
Docker-Compose peut être utilisé pour automatiser facilement les déploiements multi-continents. L'une des tâches les plus difficiles lors de l'exécution de tels déploiements est de séparer les données des logiciels.

Alors que les conteneurs sont éphémères, les données des utilisateurs doivent persister. Un exemple classique, c'est lorsque nous essayons d'exécuter des images de conteneurs de base de données. Si vous détruisez le conteneur de la base de données, les données sont également perdues. Ce que nous voulons, c'est une situation où l'image du conteneur de, disons, PostgreSQL version 9 peut être remplacée par une image de la version 10 sans que nous ayons à perdre des données. Ceci est la manière docker de la mise à niveau du logiciel, vous ne déposez pas dans le conteneur et mettez à jour les packages à l'aide d'un gestionnaire de packages. Vous remplacez l'image entière de conteneur.

Voyons quelques pièges que vous pouvez rencontrer en faisant cela et comment nous pouvons rendre le processus beaucoup plus lisse et plus propre d'un point de vue opérationnel.

Conditions préalables

  1. Une installation Docker
  2. Compréhension de base de Docker CLI et Docker-Compose

Volumes Docker et comportement par défaut de PostgreSQL

Les volumes de docker sont le moyen recommandé de persister les données. Ce sont des systèmes de fichiers gérés par le démon docker et le plus souvent, vous devez en créer un et le monter à l'intérieur de votre conteneur lorsque vous le lancez. L'image officielle de Postgres est cependant livrée avec un volume prédéfini dans sa description d'image.

Cela signifie que lorsque vous exécutez une image postgresql en tant que conteneur, il crée un volume pour lui-même et stocke les données là-dedans.

$ docker run -d --name mydb postgres

Vous pouvez répertorier les volumes existants à l'aide de la commande Docker Volume LS et vous pouvez inspecter le conteneur Docker MyDB pour voir lequel de ces volumes est monté dans le conteneur de la base de données.

$ volume docker ls
Nom du volume du conducteur
Local 8328940661C0703ED867B004EA6343B9432E70069280B71CFCE592ECDD12E55D
$ docker inspecter mydb

"Monte": [

"Type": "Volume",
"Nom": "8328940661C0703ED867B004EA6343B9432E70069280B71CFCE592ECDDD12E55D",
"Source": "/ var / lib / docker / volumes / 8328940661c0703ed867b004ea6343b9432e70069280b71cf
CE592ECDD12E55D / _DATA ",
"Destination": "/ var / lib / postgresql / data",
"Driver": "local",
"Mode": "",
"RW": vrai,
"Propagation": ""

]],

Vous remarquerez que le volume a un nom assez hostile et est monté à / var / lib / postgresql / data.

Retirons ce conteneur et le volume associé pour l'instant:

$ docker rm -f mydb
$ Docker Volume RM 8328940661C0703ED867B004EA6343B9432E70069280B71CFCE592ECDD12E55D

Il en va de même lorsque vous créez un conteneur à l'aide d'un fichier Docker-Compose simple. Ce qui suit est un compose docker.Fichier YML placé dans un répertoire nommé Postgres.

Version: '3'
prestations de service:
MyDB:
Image: Postgres

Vous pouvez le nourrir à Docker-Compose, en ouvrant un terminal dans le même répertoire où ce fichier est et en cours d'exécution:

$ docker-compose up -d

Cela crée un conteneur et un volume un peu comme la commande docker run que nous avons vue plus tôt. Cependant, ces deux méthodes, une impliquant Docker-Compose et une autre CLI Docker ont un problème fatal et cela entre en jeu lorsque vous devez remplacer l'ancienne image Postgres par une nouvelle.

De nouveaux volumes à chaque fois

Si vous supprimez le déploiement ci-dessus en fonctionnant:

$ docker-compose

Le conteneur et le réseau sont supprimés mais le volume colle et vos données sont sûres. Cependant la prochaine fois que vous courez:

$ docker-compose up -d

Compose créera un nouveau volume et monte à utiliser au lieu d'utiliser le volume créé précédemment. Et comment peut-il se rappeler que le volume précédent était destiné à ce conteneur postgresql particulier de toute façon? Mais le pauvre utilisateur qui pourrait même ne pas être conscient du concept de volumes sera confus se demandant où toutes les données ont disparu.

Volume défini par l'utilisateur

Pour contourner ce problème, nous pouvons utiliser les informations que nous avons recueillies plus tôt qui nous ont montré que le volume est monté à / var / lib / postgresql / data. À l'intérieur du conteneur, ce répertoire est l'endroit où Postgres stocke toutes les tables et bases de données pertinentes.

Nous devons maintenant définir un volume à l'intérieur du fichier de compose et le monter à ce point de montage. C'est ainsi que le docker-compose.yml ressemblerait à.

Version: '3'
prestations de service:
MyDB:
Image: Postgres
Volumes:
- db-data: / var / lib / postgresql / data
PORTS:
- 5432: 5432
Volumes:
DB-Data:
Conducteur: local

La dernière ligne «Driver: Local» est complètement facultative et est mentionnée ici juste pour montrer que le «Clé de niveau supérieur volumes » peut avoir plusieurs volumes définis en dessous. DB-Data est un de ces volumes qui à son tour a des détails, comme les conducteurs, inclus comme un bloc en retrait en dessous.

Dans le cadre du service MyDB, nous avons à nouveau la clé de volumes. Ce "niveau de service Clé des volumes » Il s'agit d'une liste de volumes définis sous la touche de volumes de niveau supérieur mappé sur des points de montage à l'intérieur des conteneurs

Lorsque vous exécutez Docker-Compose Up -D Commande la première fois avec la définition YML ci-dessus, il créera un volume, pas avec une chaîne aléatoire comme son nom, mais DB-Bata comme son nom. Ensuite, chaque fois que vous réduisez l'application (docker-compose vers le bas), puis réinstallez le docker-compose up -d compose essaiera de créer un volume nommé DB-Data, mais il remarquerait ensuite qu'un volume avec ce nom existe déjà. Ensuite, il reviendra utilement le même volume. Remettons la demande pour le moment:

$ docker-compose

Utilisation de PostgreSQL

L'image officielle de Postgres expose le port 5432 à notre avantage. À strictement parler, ce n'est pas nécessaire. Les bases de données ne sont que l'un des nombreux services exécutés sur un réseau Docker. Les autres services, comme le serveur Web, peuvent parler à la base de données sans aucun port explicite en cours de publication. En effet. Donc, si le serveur Web et la base de données sont sur le même réseau de ponts, ils peuvent se parler même sans que les ports ne soient explicitement ouverts.

Les bases de données ne sont souvent pas exposées au monde extérieur, mais accessibles par d'autres services. Par conséquent, publier le port de Postgres n'est pas quelque chose que vous verriez souvent en production.

Cependant, nous expérimenterons l'application conteneurisée pour voir si les données persistent afin que nous puissions exposer et publier les ports pour l'instant. Modifier le docker-compose.Fichier YML avec une option de ports supplémentaires.

Version: '3'
prestations de service:
MyDB:
Image: Postgres
Volumes:
- db-data: / var / lib / postgresql / data
PORTS:
- 5432: 5432 / TC
Volumes:
DB-Data:
Conducteur: local

Maintenant, nous sommes prêts à s'interfacer avec l'instance Postgres à l'aide du programme client PGADMIN. Vous pouvez installer ce client sur votre machine locale en utilisant votre méthode préférée si vous suivez ce lien. Après avoir installé le client, vous pouvez vous connecter au serveur de base de données, mais commençons d'abord le serveur de base de données.

$ docker-compose up -d

Cette fois, les demandes entrantes du port hôte Docker 5432 seront transmises au port 5432 du conteneur de la base de données, où le serveur Postgres peut le traiter.

Connexion au serveur

Démarrez le client Pgadmin et vous pouvez y accéder via votre navigateur Web. Dans le tableau de bord, vous trouverez l'option appelée Ajouter un nouveau serveur.

Donnez-lui un nom raisonnable, nous allons avec "Ma base de données »:

Et sous l'onglet Connexions, entrez l'adresse où la base de données est en cours d'exécution:

L'adresse peut être locale si vous exécutez à la fois Pgadmin et le conteneur Postgres exécute sur la même machine. Si vous exécutez un conteneur postgres sur un VPS distant, par exemple, l'adresse IP de ce VPS sera nécessaire ici. En général, nous l'appelons l'adresse de l'hôte Docker parce que c'est là que Docker fonctionne.

Nous laisserons le champ de mot de passe vide et le numéro de port par défaut 5432 est également très. Enregistrez les paramètres du serveur et créons une base de données là-dedans.

Sur une connexion réussie, vous pouvez voir toutes les activités internes:

Dans le menu du navigateur, nous pouvons sélectionner rapidement Ma base de données serveur et sous-cliquez avec le bouton droit sur la base de données et Créer une base de données.

Créons rapidement une base de données appelée Exemple de base de données.

Vous n'avez pas à créer autre chose ici. Maintenant, nous pouvons fermer la fenêtre et retourner au terminal ouvert au même répertoire où notre docker-compose.YML vit.

$ docker-compose
$ docker-compose up -d

L'ancien conteneur a maintenant disparu et un nouveau a pris sa place. Vous pouvez ouvrir à nouveau Pgadmin et vous devrez vous reconnecter à cette base de données (un mot de passe vide ferait) et à l'intérieur, vous constaterez que tout est comme vous l'avez laissé pour être. Il y a même un Exemple de base de données là-dedans.

Conclusion

Nous voulions écrire un fichier docker-compose qui a rendu la mise à niveau de Postgres. Si une nouvelle image de Postgres se présente en cours d'exécution Postgres 11, vous pouvez maintenant tirer en toute confiance la nouvelle image et exécuter une mise à niveau sans aucune inquiétude sur l'état de l'application perdu.

Le comportement par défaut de l'image postgres qui est de créer un nouveau volume à chaque fois qu'un conteneur est créé n'est pas un mauvais choix de conception. Il est mis en œuvre avec le meilleur intérêt dans l'âme.

Mais cela repousse simplement un nouvel utilisateur qui se gratterait la tête en se demandant où toutes les données se perdent et pourquoi y a-t-il tant de volumes qui se trouvent dans leur hôte Docker. J'espère que ce ne sera plus un problème pour les lecteurs.