Docker et JavaScript : conteneurisation d'applications Node.js — guide complet
Dans le développement web moderne, la conteneurisation est devenue non seulement une tendance, mais une nécessité. Docker permet d'empaqueter une application JavaScript avec toutes ses dépendances, configurations et environnement d'exécution dans un conteneur isolé qui fonctionnera de manière identique sur n'importe quel système — du portable du développeur au serveur de production. Dans cet article, nous allons détailler le processus de conteneurisation d'applications Node.js à partir de zéro, examiner les meilleures pratiques et les scénarios d'utilisation typiques.
Les bases de Docker pour le développeur JavaScript
Avant de plonger dans les détails, comprenons les concepts clés de Docker appliqués à l'écosystème JavaScript.
- Image — modèle immuable contenant le code, l'environnement d'exécution Node.js, les dépendances (node_modules) et les configurations. Les images sont stockées dans un registre (par exemple, Docker Hub).
- Conteneur — instance en cours d'exécution d'une image. Chaque conteneur est isolé des autres et du système hôte.
- Dockerfile — instructions pour construire l'image. Pour les applications Node.js, c'est le fichier principal que nous allons créer.
- docker-compose — outil pour définir et exécuter des applications multi-conteneurs (par exemple, Node.js + MongoDB + Redis).
Création d'un Dockerfile pour une application Node.js
Commençons par une simple application Express. Créons un fichier Dockerfile à la racine du projet :
# Image de base Node.js 18 (Alpine — version légère)FROM node:18-alpine
# Créer un répertoire de travail à l'intérieur du conteneurWORKDIR /usr/src/app
# Copier package.json et package-lock.json (s'il existe)COPY package*.json ./
# Installer les dépendances de productionRUN npm ci --only=production
# Copier le code source de l'applicationCOPY . .
# Ouvrir le port que l'application va écouterEXPOSE 3000
# Commande pour lancer l'applicationCMD ["node", "src/index.js"]Points importants pour les projets JavaScript :
- L'ordre des instructions a son importance. Copier package.json avant le code permet à Docker de mettre en cache la couche d'installation des dépendances. Si vous modifiez uniquement le code, les dépendances ne sont pas réinstallées — cela accélère la construction.
- Utilisez
npm ciau lieu denpm install— c'est plus rapide et garantit que les versions des dépendances correspondent au fichier lock. - La version Alpine de l'image Node.js (~120 Mo au lieu de ~900 Mo) réduit considérablement la taille de l'image finale.
Travailler avec docker-compose : lier Node.js à une base de données
Les applications réelles utilisent rarement un seul conteneur. docker-compose.yml permet de lancer Node.js, MongoDB et, par exemple, Redis avec une seule commande :
version: '3.8'services: app: build: . ports: - "3000:3000" environment: - NODE_ENV=production - MONGODB_URI=mongodb://mongo:27017/myapp - REDIS_URL=redis://redis:6379 depends_on: - mongo - redis volumes: - ./logs:/usr/src/app/logs
mongo: image: mongo:6 volumes: - mongo_data:/data/db ports: - "27017:27017"
redis: image: redis:7-alpine ports: - "6379:6379"
volumes: mongo_data:Comment cela fonctionne :
- Le service
appest construit à partir de notre Dockerfile. - Les services
mongoetredisutilisent des images prêtes à l'emploi depuis Docker Hub. - Les variables d'environnement
MONGODB_URIetREDIS_URLsont transmises à l'application — notez que nous utilisons les noms des services comme noms d'hôte (le DNS Docker les résout automatiquement en adresses IP des conteneurs). - Le volume
mongo_d