Using Docker with Postgres: Tutorial and Best Practices

Utiliser Docker avec Postgres : didacticiel et bonnes pratiques

Cet article traite de PostgreSQL sur Docker. Earthly simplifie votre processus de construction pour la création de scripts pour les configurations PostgreSQL Docker. Vérifiez-le.

Les bases de données relationnelles constituent un moyen simple de stocker des données relationnelles depuis quelques décennies. Au fil des années, de nombreux systèmes de gestion de bases de données populaires ont été créés, mais leur installation peut s’avérer délicate.

Pour éviter toutes les complications liées à l’installation et à la configuration des serveurs de bases de données, les utilisateurs peuvent désormais tirer parti des conteneurs Docker spécialement développés pour prendre en charge les solutions de bases de données.

Dans cet article, vous en apprendrez plus sur ce qu’est Docker et comment l’utiliser. Vous examinerez ensuite quelques bonnes pratiques pour exécuter des bases de données PostgreSQL sur des conteneurs Docker. Pour en savoir plus sur Docker, vous pouvez consulter le guide officiel.

Pour en savoir plus sur Docker, vous pouvez consulter le guide officiel.

Cas d’utilisation pour exécuter PostgreSQL sur Docker

Lorsque vous envisagez d’exécuter PostgreSQL, vous devez prendre en compte la portabilité. Si vous êtes un développeur travaillant sur plusieurs machines, chaque fois que vous changez de machine, vous devez installer et configurer la base de données séparément. Si vous utilisez PostgreSQL dans un conteneur Docker, vous pouvez rapidement utiliser Docker pour lancer des conteneurs PostgreSQL et vous concentrer sur le développement réel plutôt que sur la configuration.

Cependant, gardez à l’esprit que les données ne sont pas persistantes et sont supprimées dès que le conteneur est désactivé lorsque vous utilisez PostgreSQL dans un conteneur Docker. Afin de résoudre ce problème, vous pouvez monter un répertoire local en tant que volume et stocker les données PostgreSQL du conteneur dans le volume local. Vous en apprendrez plus à ce sujet ci-dessous.

En plus de cela, les bases de données sont des applications avec état, tandis que les conteneurs sont conçus pour exécuter des applications sans état. En outre, les bases de données sont des applications très gourmandes en ressources et leur exécution sur une charge de travail de production n’est pas idéale. Une solution alternative pourrait consister à utiliser n’importe quelle offre de base de données en tant que service d’un fournisseur de cloud, comme AWS, GCP ou Azure en production, mais à utiliser des conteneurs pour un développement rapide.

Comment exécuter PostgreSQL à l’aide de Docker

Dans cette section, vous allez exécuter une instance PostgreSQL à l’aide de Docker et utiliser une interface utilisateur graphique (GUI) et pgAdmin pour vous connecter à la base de données. Pour commencer, vous devez avoir Docker installé sur votre ordinateur. Vous pouvez vérifier si Docker est déjà installé sur votre machine en exécutant la commande suivante sur votre terminal :

$ docker --version
  Docker version 20.10.1, build dea9396

Si Docker n’est pas installé, vous pouvez l’installer à partir du site officiel.

Télécharger l’image Docker de PostgreSQL

Avec Docker, vous pouvez soit créer ou posséder vos images, soit utiliser des images du référentiel. Dans ce cas, puisque vous utilisez une image Docker PostgreSQL, elle peut être extraite de Docker Hub à l’aide de la commande suivante :

Cette commande vous connecte au Docker Hub et extrait l’image PostgreSQL sur votre machine. Par défaut, Docker extrait la dernière image du Docker Hub.

Notez que Docker utilise la balise par défaut Latest si aucune balise n’est définie dans la demande d’extraction. Cependant, en fonction de vos besoins, vous pouvez toujours spécifier une version spécifique de l’image avec laquelle vous souhaitez travailler.

$ docker pull postgres
Using default tag: latest
latest: Pulling from library/postgres
ae13dd578326: Pull complete
723e40c35aaf: Pull complete
bf97ae6a09b4: Pull complete
2c965b3c8cbd: Pull complete
c3cefa46a015: Pull complete
64a7315fc25c: Pull complete
b9846b279f7d: Pull complete
ed988fb8e7d9: Pull complete
ed4bb4fd8bb5: Pull complete
ead27f1733c8: Pull complete
7d493bacd383: Pull complete
0920535e8417: Pull complete
db76d5bdbf2c: Pull complete
Digest: sha256:99aa522df573a6f117317ab9627c1ba4717513090fd013b937c91a288933ee90
Status: Downloaded newer image for postgres:latest
docker.io/library/postgres:latest

Vérifier les images Docker installées

Une fois l’image PostgreSQL Docker extraite du Docker Hub, vous pouvez vérifier l’image à l’aide de la commande suivante :

$ docker image ls
REPOSITORY                                 TAG             IMAGE ID       CREATED         SIZE
postgres                                   latest          5cd1494671e9   15 hours ago    376MB

Cette commande répertorie toutes les images installées sur votre ordinateur local.

Exécutez le conteneur Docker PostgreSQL

Maintenant que vous avez l’image PostgreSQL Docker sur votre machine, vous pouvez démarrer le conteneur. Comme mentionné ci-dessus, un conteneur est une instance d’une image Docker. Afin de démarrer le conteneur PostgreSQL, vous devez fournir quelques paramètres à Docker, qui sont expliqués ci-dessous :

  • –name : le nom du conteneur PostgreSQL.
  • –rm : cela supprime le conteneur lorsqu’il est arrêté.
  • -e : la seule variable d’environnement obligatoire est le mot de passe de la base de données qui doit être fourni avant de créer le conteneur.
  • -p : le mappage de port doit être fourni afin que le port hôte de la machine soit mappé au port du conteneur PostgreSQL à l’intérieur du conteneur.
docker run 
  --name pgsql-dev 
rm 
  -e POSTGRES_PASSWORD=test1234 
  -p 5432:5432 postgres
Démarrage du conteneur PostgreSQL

Dès que vous exécutez la commande ci-dessus, Docker démarre le conteneur PostgreSQL pour vous et le rend disponible. Une fois votre conteneur opérationnel, vous pouvez ouvrir une autre fenêtre de terminal et vous connecter à la base de données PostgreSQL exécutée à l’intérieur du conteneur.

Maintenant, ouvrez une autre fenêtre de terminal et tapez la commande suivante :

$ docker exec -it pgsql-dev bash
root@6b7f283ad618:/#

Cette commande vous permet de vous connecter à la CLI PostgreSQL exécutée dans le conteneur Docker. Une fois la borne interactive démarrée, vous pouvez vous connecter à l’instance PostgreSQL avec la commande suivante :

psql -h localhost -U postgres

Cette commande vous connecte à la base de données PostgreSQL en utilisant l’utilisateur PostgreSQL par défaut. Les configurations sont les suivantes :

  • Nom d’hôte : vous devez fournir le nom d’hôte sur lequel le conteneur PostgreSQL Docker est exécuté. Il s’agit généralement de « localhost » s’il s’exécute localement.
  • Nom d’utilisateur : par défaut, l’image PostgreSQL utilise un nom d’utilisateur « postgres » que vous pouvez utiliser pour vous connecter à la base de données.

Vous pouvez maintenant exécuter des requêtes SQL sur cette base de données comme d’habitude :

postgres=# l
                                 List of databases
   Name    |  Owner   | Encoding |  Collate   |   Ctype    |   Access privileges
-----------+----------+----------+------------+------------+-----------------------
 postgres  | postgres | UTF8     | en_US.utf8 | en_US.utf8 |
 template0 | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c/postgres          +
           |          |          |            |            | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c/postgres          +
           |          |          |            |            | postgres=CTc/postgres
(3 rows)

postgres=#

Utiliser un volume persistant pour stocker des données

Dans la section ci-dessus, vous avez appris à créer et exécuter un conteneur Docker pour PostgreSQL. Un point important à noter est que lorsque vous effectuez un DDL ou un DML dans votre base de données, toutes les données sont écrites dans le conteneur. Cela signifie que dès que vous supprimez le conteneur de votre machine, il n’y a aucun moyen d’accéder aux données.

Afin de surmonter ce problème, vous souhaiterez peut-être écrire les données en dehors du conteneur Docker sur votre lecteur de disque. De cette façon, vous pouvez exécuter votre conteneur PostgreSQL sur Docker et stocker toutes les données dans un répertoire qui n’est pas affecté par les opérations Docker. Ultérieurement, vous pourrez également utiliser une autre instance PostgreSQL pour lire ces données persistantes en montant un volume pour votre conteneur Docker.

Fondamentalement, vous devez mapper le répertoire de données de PostgreSQL depuis l’intérieur du conteneur vers un répertoire sur votre machine locale. Cela peut être fait en utilisant la commande suivante :

$ docker run 
  --name pgsql-dev 
  -e POSTGRES_PASSWORD=test1234 
  -d 
  -v ${PWD}/postgres-docker:/var/lib/postgresql/data 
  -p 5432:5432 postgres 
3f1ae1ace07ab7902851d8e968a4a0b245cd4171eaa91181e859f21cbea14415

Comme vous pouvez le voir ci-dessus, vous disposez de deux nouveaux paramètres :

  • Mode détaché : noté d, le mode détaché permettra au conteneur de s’exécuter en arrière-plan.
  • Volume : le répertoire local sur l’hôte est mappé au répertoire de données pour PostgreSQL à l’intérieur du conteneur.

Notez que les deux chemins sont séparés par deux points.

Lorsque vous exécutez la commande ci-dessus, vous verrez que le conteneur a démarré et que les fichiers de données sont disponibles dans le répertoire que vous avez configuré lors du démarrage du conteneur. (Vous aurez peut-être besoin de l’autorisation de superutilisateur pour afficher le contenu du répertoire.)

Répertoire monté localement

Meilleures pratiques pour exécuter PostgreSQL sur Docker

Docker facilite la configuration d’une base de données PostgreSQL en quelques secondes. Mais il existe peu de bonnes pratiques capables de garantir une expérience fluide et d’offrir une sécurité supplémentaire.

  1. Utilisez un volume persistant pour stocker les données. Comme mentionné ci-dessus, sans volume persistant, vous perdrez des données si le conteneur redémarre.
  2. Utilisez des images alpines si possible. Ils sont généralement de plus petite taille. Par exemple, postgres:14.2sa taille est de 131 Mo alors qu’elle postgres:14.2-alpinene fait que 78 Mo avec la même fonctionnalité. De plus, les images alpines sont sécurisées car tous les binaires de l’espace utilisateur sont compilés pour se protéger contre les vulnérabilités courantes.
  3. Sauvegardez périodiquement vos données. Vous pouvez le faire en exécutant la pg_dumpcommande à partir du conteneur de base de données :
docker exec -it <container_name> 
  pg_dump -U<user_name> --column-inserts --data-only <db_name> > 
  backup_data.sql

  1. S’il n’y a pas de base de données au démarrage de PostgreSQL dans un conteneur, une base de données par défaut sera créée et n’acceptera pas les connexions entrantes pendant ce temps. Cela peut entraîner des problèmes avec les outils d’automatisation qui peuvent tenter d’accéder à la base de données dès le démarrage du conteneur. Pour atténuer ce problème, vous devez vous assurer que la base de données accepte les connexions avant d’essayer de vous y connecter. Si vous utilisez Docker Compose, vous pouvez utiliser la fonctionnalité de contrôle de santé :
healthcheck:
       test: ["CMD-SHELL", "pg_isready -U postgres"]
       interval: 5s
       timeout: 5s
       retries: 5

Limites de l’exécution de la base de données PostgreSQL avec Docker

Bien que le démarrage rapide et la configuration facile de Docker soient une aubaine pour le développement et les tests, il n’est généralement pas conseillé d’exécuter des bases de données de production dans Docker. La raison principale est que les conteneurs Docker sont parfaits pour exécuter des applications sans état. Les conteneurs peuvent être terminés à tout moment et ramenés instantanément. Plusieurs conteneurs de la même application peuvent s’exécuter en même temps et, étant sans état, cela n’affecte pas le flux de travail.

Cependant, une base de données est dynamique et toute perturbation provoquée dans une application de base de données peut avoir des conséquences catastrophiques. Même si vous utilisez un volume pour conserver les données, un conteneur de base de données qui plante et s’arrête au milieu d’une transaction pourrait être un désastre. Pour la production, il est toujours recommandé de choisir des solutions de plateforme en tant que service comme GCP, AWS ou Azure.

Conclusion

Dans cet article, vous avez appris à exécuter une instance PostgreSQL sur Docker. Vous avez implémenté l’instance à l’aide de Docker et utilisé une interface graphique et pgAdmin pour vous connecter à la base de données. Vous avez également découvert quelques bonnes pratiques, telles que l’utilisation d’un volume persistant pour stocker les données, afin de pouvoir offrir une expérience fluide et sécuriser les données.

Afin de déployer vos applications basées sur des conteneurs, vous devez implémenter un pipeline CI/CD qui créera en permanence votre image Docker et la déploiera lorsque de nouvelles versions de votre code seront disponibles. Earthly est un outil CI populaire qui peut être utilisé pour automatiser vos déploiements de conteneurs. Il fournit des intégrations avec la plupart des outils CI populaires.

Dr Omar omari

Je suis Omar, fondateur de Voyage Voices. Avec des années d'expérience en croisière, je me consacre à vous guider à travers la vaste mer d'informations sur la croisière. Lorsque vous ne naviguez pas ou ne faites pas de recherche, je vous fournis des conseils fiables et à jour pour vous aider à créer l'expérience de croisière parfaite. Laissez-moi être votre boussole de confiance dans le monde des croisières.

Voir tous les articles de Dr Omar omari →

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *