Deployer Express avec Docker
Pourquoi Deployer Express avec Docker ?
Dans un environnement professionnel, l'intégration continue et le déploiement continu (CI/CD) sont des pratiques essentielles pour assurer la qualité et la rapidité de livraison du code. En particulier, les applications basées sur Node.js comme Express présentent des défis spécifiques en matière de déploiement en raison de leurs dépendances externes variées. Docker permet d'empaqueter une application avec toutes ses dépendances dans un conteneur standardisé, ce qui facilite le déploiement et garantit la portabilité.
Un cas concret est la mise en production d'un service API backend pour une application web. Avec Express, vous créez une couche d'abstraction entre les requêtes HTTP et votre logique métier. En utilisant Docker, vous pouvez satisfaire à des exigences strictes de sécurité et de performance tout en assurant que l'environnement de production est identique à celui du développement.
Prerequis
Connaissances nécessaires :
- Node.js v14 ou plus
- npm (Node Package Manager) v6 ou plus
- Docker v20 ou plus
- Basic understanding of JavaScript and Express
Outils à installer :
Concepts fondamentaux
Dockerfile
Le Dockerfile est un fichier texte qui contient les instructions pour construire une image Docker. Voici comment il ressemble :
## 👇 Base image : utilise Node.js 14
FROM node:14
## 👇 Créer le répertoire de travail dans l'image Docker
WORKDIR /app
## 👇 Copier les fichiers package.json et package-lock.json pour installer les dépendances
COPY package*.json ./
## 👇 Installer toutes les dépendances du projet
RUN npm install
## 👇 Copier tous les fichiers restants du répertoire local vers le répertoire de travail dans l'image Docker
COPY . .
## 👇 Commande pour exécuter l'application Express
CMD ["node", "index.js"]
docker-compose.yml
docker-compose.yml permet de définir et de gérer plusieurs conteneurs Docker à partir d'un seul fichier. Voici un exemple :
version: '3'
services:
app:
build: .
ports:
- "3000:3000"
Image Docker
Une image Docker est une seule étape dans le processus de construction du conteneur. Elle représente une version spécifique d'un environnement. Dans notre cas, l'image node:14 est utilisée en tant que base.
Conteneur Docker
Un conteneur Docker est une instance exécutable de l'image Docker. Il prend les instructions définies dans le Dockerfile et crée un environnement isolé pour l'application.
Mise en pratique : projet fil rouge
Pour ce tutoriel, nous allons créer un simple service API RESTful pour gérer des tâches en utilisant Express et Docker.
Étape 1 : Créer le projet
mkdir task-manager-api
cd task-manager-api
npm init -y
Étape 2 : Installer les dépendances
npm install express body-parser
Étape 3 : Créer le fichier index.js
// 👇 Importer Express et Body Parser
const express = require('express');
const bodyParser = require('body-parser');
// 👇 Initialiser l'application Express
const app = express();
// 👇 Utiliser Body Parser pour analyser les requêtes JSON
app.use(bodyParser.json());
// 👇 Gestionnaire de route pour obtenir toutes les tâches
app.get('/tasks', (req, res) => {
const tasks = [
{ id: 1, title: 'Faire les courses' },
{ id: 2, title: 'Faire le ménage' }
];
res.json(tasks);
});
// 👇 Gestionnaire de route pour ajouter une tâche
app.post('/tasks', (req, res) => {
const task = req.body;
tasks.push(task);
res.status(201).json(task);
});
// 👇 Définir le port d'écoute
const PORT = process.env.PORT || 3000;
// 👇 Démarrer le serveur
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});
Étape 4 : Créer le fichier Dockerfile
## 👇 Base image : utilise Node.js 14
FROM node:14
## 👇 Créer le répertoire de travail dans l'image Docker
WORKDIR /app
## 👇 Copier les fichiers package.json et package-lock.json pour installer les dépendances
COPY package*.json ./
## 👇 Installer toutes les dépendances du projet
RUN npm install
## 👇 Copier tous les fichiers restants du répertoire local vers le répertoire de travail dans l'image Docker
COPY . .
## 👇 Commande pour exécuter l'application Express
CMD ["node", "index.js"]
Étape 5 : Créer le fichier docker-compose.yml
version: '3'
services:
app:
build: .
ports:
- "3000:3000"
Étape 6 : Construire et exécuter l'application
## 👇 Construire l'image Docker
docker-compose up --build
Erreurs fréquentes et debugging
Erreur :
Error: Cannot find module 'express'- Cause : Les dépendances n'ont pas été installées correctement.
- Correction :
npm install express body-parser
Erreur :
Port 3000 is already in use- Cause : Une autre application utilise déjà le port 3000.
- Correction :
docker-compose down docker-compose up --build
Erreur :
Error: listen EADDRINUSE: address already in use :::3000- Cause : Le même port est utilisé dans la configuration Docker.
- Correction :
docker-compose down docker-compose up --build
Pour aller plus loin
Utiliser Kubernetes pour déployer Express sur un cluster de machines
Optimiser l'image Docker avec des layers non cachables
Utiliser un système de gestion de version pour gérer les modifications du projet
Défi pratique
Définir une API de blog simple en utilisant Express et Docker.
Créez une application qui permet d'ajouter, récupérer et supprimer des articles de blog. Assurez-vous que l'application est déployable avec Docker.
Ce tutoriel vous a guidé à travers le processus de déploiement d'une application Express avec Docker. Vous avez créé un projet simple, configuré les fichiers Dockerfile et docker-compose.yml, et exécuté l'application en conteneur Docker. N'oubliez pas que la maîtrise de ces concepts est cruciale pour le déploiement efficace d'applications basées sur Node.js dans un environnement professionnel.