Using Redis with docker and docker-compose for local development a step-by-step tutorial

Utiliser Redis avec docker et docker-compose pour le développement local, un didacticiel étape par étape

Redis est une banque de données en mémoire open source utilisée comme base de données, cache et même courtier de messages. Redis peut être utilisé facilement avec Docker et Docker-Compose pour le développement local en tant que cache pour une application Web. Dans cet article, nous allons configurer Redis avec docker et docker-compose, où Redis sera utilisé comme cache pour une API REST Node.js/Express.js avec PostgreSQL comme base de données principale, commençons !

Utilisez Redis avec Docker et docker-compose facilement

Table des matières #

Conditions préalables #

Avant de commencer à examiner le code, voici quelques bonnes conditions préalables :

  1. Une connaissance générale du fonctionnement de Docker serait un avantage.
  2. Il est prévu qu’il ait suivi le didacticiel Node.js Postgres avec les API de citations.
  3. Passer par la publication Node.js Redis serait très bénéfique.
  4. Toute connaissance pratique de Redis, de sa ligne de commande et de certaines commandes de base telles que KEYS, MGET serait utile.

Étant donné que cela est mentionné, nous pouvons maintenant commencer par exécuter Redis avec uniquement Docker.

Retour et Docker#

Redis, comme mentionné, peut également être utilisé comme cache. Pour cet article, nous utiliserons Redis comme cache en mémoire au lieu d’obtenir les données d’une base de données Postgres. Pour ce faire, nous utiliserons l’image docker officielle Redis de Dockerhub. Pour exécuter la version Redis 6.2 sur un conteneur Alpine, nous exécuterons la commande suivante :

docker run --rm --name test-redis redis:6.2-alpine redis-server --loglevel warning

La commande ci-dessus démarrera un conteneur nommé test-redispour la version d’image donnée de 6.2-alpine` avec le niveau de journalisation d’avertissement. Cela donnera le résultat suivant :

Exécutez Redis avec uniquement Docker

Pour exécuter certaines commandes Redis à l’intérieur du conteneur, nous pouvons exécuter docker exec -it test-redis redis-clice qui exécutera le redis-cli dans le conteneur en cours d’exécution. Nous pouvons essayer quelques commandes Redis comme ci-dessous pour voir que les choses fonctionnent :

Exécutez Redis CLI dans le conteneur Redis Docker

Comme vu ci-dessus, nous pourrions définir une valeur avec la clé testet la récupérer. Comme aucun volume n’est défini ni aucune commande donnée pour persister, les clés et les valeurs seront perdues lorsque le conteneur s’arrêtera. Si vous recherchez une base de données relationnelle avec docker, essayez ce tutoriel sur PostgreSQL et Docker. Ensuite, nous examinerons la possibilité d’exécuter la même version de Redis avec docker-compose.

Redis avec Docker-compose #

Pour exécuter Redis avec Docker-compose, y compris la persistance et l’authentification, nous utiliserons le fichier docker-compose nommé docker-compose-redis-only.ymlcomme indiqué ci-dessous :

version: '3.8'
services:
cache:
image: redis:6.2-alpine
restart: always
ports:
- '6379:6379'
command: redis-server --save 20 1 --loglevel warning --requirepass eYVX7EwVmmxKPCDmwMtyKVge8oLd2t81
volumes: 
- cache:/data
volumes:
cache:
driver: local

Ici, dans le fichier docker-compose ci-dessus, nous avons défini un service appelé cache. Le service de cache extraira l’ redis:6.2.alpineimage de Dockerhub. Il est configuré pour redémarrer toujours, si le conteneur Docker échoue pour une raison quelconque, il redémarrera. Ensuite, nous mappons le port du conteneur 6379au port local 6379. Si nous souhaitons exécuter plusieurs versions de Redis, nous pouvons choisir un port aléatoire.

Par conséquent, nous utilisons une redis-servercommande personnalisée --save 20 1qui demande au serveur de sauvegarder 1 ou plusieurs écritures toutes les 20 secondes sur le disque au cas où le serveur redémarrerait. Nous utilisons le --requirepassparamètre pour ajouter une authentification avec le mot de passe pour lire/écrire des données sur le serveur Redis. Comme nous le savons, s’il s’agissait d’une application de production, le mot de passe ne sera pas divulgué. Ceci est fait ici parce que cela est uniquement destiné à des fins de développement.

Par la suite, nous utilisons un volume pour lequel /datatoutes les écritures seront conservées. Il est mappé sur un volume appelé cache. Ce volume est géré en tant que pilote local, vous pouvez en savoir plus sur le pilote de volume Docker si vous le souhaitez.

Si nous exécutons un docker-compose up avec le fichier ci-dessus, l’utiliser ​​docker-compose -f docker-compose-redis-only.yml updonnera un résultat comme ci-dessous :

Exécutez uniquement Redis avec docker-compose - sortie

Ce conteneur fonctionne de la même manière que celui ci-dessus. Les deux principales différences ici sont que le volume est monté pour conserver les données enregistrées lors des redémarrages du conteneur et que le mot de passe est fourni pour l’authentification. Dans la section suivante, nous ajouterons Redis à une application existante disposant d’une base de données PostgreSQL et d’une API Node.js utilisant cette base de données.

Ajouter Redis à une application Node.js existante #

À titre d’exemple pour ce guide, nous utilisons l’application API Quotes construite avec Node.js et Postgres. Nous allons introduire le service Redis dans le fichier docker-compose existant comme suit :

version: '3.8'
services:
  db:
    image: postgres:14.1-alpine
    restart: always
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
    ports:
      - '5432:5432'
    volumes: 
      - db:/var/lib/postgresql/data
      - ./db/init.sql:/docker-entrypoint-initdb.d/create_tables.sql
  cache:
    image: redis:6.2-alpine
    restart: always
    ports:
      - '6379:6379'
    command: redis-server --save 20 1 --loglevel warning --requirepass eYVX7EwVmmxKPCDmwMtyKVge8oLd2t81
    volumes: 
      - cache:/data
  api:
    container_name: quotes-api
    build:
      context: ./
      target: production
    image: quotes-api
    depends_on:
      - db
      - cache
    ports:
      - 3000:3000
    environment:
      NODE_ENV: production
      DB_HOST: db
      DB_PORT: 5432
      DB_USER: postgres
      DB_PASSWORD: postgres
      DB_NAME: postgres
      REDIS_HOST: cache
      REDIS_PORT: 6379
      REDIS_PASSWORD: eYVX7EwVmmxKPCDmwMtyKVge8oLd2t81
    links:
      - db
      - cache
    volumes:
      - ./:/src
volumes:
  db:
    driver: local
  cache:
    driver: local

Ce fichier est similaire au fichier docker-compose ci-dessus. Les principaux changements ici sont que le apiservice dépend désormais également du cacheservice qui est notre serveur Redis. En plus de cela, dans le service API, nous transmettons les informations d’identification liées à Redis en tant que variables d’environnement supplémentaires telles que REDIS_HOST, REDIS_PORTet REDIS_PASSWORD. Ces parties ont été mises en évidence dans le fichier ci-dessus. Vous pouvez utiliser les variables d’environnement docker compose pour en savoir plus sur l’utilisation des variables d’environnement avec docker-compose.

Lorsque nous effectuons une opération régulière docker-compose upavec ce fichier docker-compose.yml, nous obtiendrons un résultat similaire à celui ci-dessous :

Exécutez Redis avec docker-compose incluant Node.js et Postgres - sortie

Selon que le conteneur Postgres contient des données, il se comportera un peu différemment. Maintenant, si nous frappons http://localhost:3000/quotes/author/chris, le résultat suivant s’affichera :

Sortie de l'API Node.js et Postgres avec Docker Redis

Actualisez cette page 2 à 3 fois et revenez à l’onglet de la console docker-compose, nous devrions voir quelque chose de similaire à ce qui suit :

Des temps de réponse beaucoup plus rapides avec Redis Docker

Comme nous pouvons le voir ci-dessus, le premier accès a été envoyé à la base de données et il a fallu 328,118 ms pour obtenir les citations de l’auteur Chris. Toutes les requêtes ultérieures ont reçu la requête du cache Redis et elle a été ultra rapide, répondant entre 5,7 et 3,48 ms. Comme le contenu mis en cache est là pendant 10 minutes, si nous exécutons l’ redis-cliintérieur du conteneur avec la commande suivante :

docker exec -it nodejs-posgresql_cache_1 redis-cli -a eYVX7EwVmmxKPCDmwMtyKVge8oLd2t81

Ensuite nous pouvons voir le contenu de la clé mise en cache et sa valeur avec : KEYS *pour lister toutes les clés. Pour lister la valeur de la clé trouvée que nous pouvons utiliser, MGET quotes_author_chris_1elle nous montrera le contenu de cette clé particulière comme indiqué ci-dessous :

Contenu de la réponse de l'API de mise en cache Redis Docker

Le cache de requêtes PostgreSQL accélérera les choses pour les appels ultérieurs, mais s’il y a beaucoup (des milliers ou des millions) de lignes dans la base de données, le cache de requêtes ne fonctionnera pas très bien. C’est là qu’un cache clé-valeur stocké en mémoire comme Redis constituerait une amélioration considérable des performances, comme vous pouvez le voir ci-dessus. La modification effectuée pour ce didacticiel est disponible sous forme de pull request pour votre référence.

Conclusion #

Nous avons vu comment utiliser Redis avec docker et avec docker-compose. Nous avons également ajouté Redis comme cache à une API Node.js existante et avons constaté les avantages en termes de performances.

J’espère que cela vous aidera à comprendre comment utiliser Redis dans n’importe quelle application avec docker et docker-compose sans aucun problème.

Continuez à mettre en cache !

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 *