Docker : Déployer vos Applications Facilement
« Ça marche sur ma machine » — cette phrase, tout développeur l'a prononcée au moins une fois. Docker résout ce problème fondamental en encapsulant votre application et toutes ses dépendances dans un conteneur portable et reproductible. Chez MapWay, Docker est au cœur de notre infrastructure : chaque composant de TMaps, Houni.tn et Code-Postale.tn tourne dans son propre conteneur.
Comprendre Docker : les concepts fondamentaux
Docker repose sur trois concepts essentiels qu'il faut maîtriser avant de commencer. Une image est un snapshot immuable contenant votre application, son runtime (Node.js, Python, Java...), ses bibliothèques et sa configuration. Un conteneur est une instance en cours d'exécution d'une image, isolée du système hôte mais partageant son noyau Linux. Un Dockerfile est la recette qui décrit comment construire une image étape par étape.
La différence fondamentale entre un conteneur et une machine virtuelle est le niveau d'isolation. Un conteneur partage le noyau du système hôte, ce qui le rend beaucoup plus léger et rapide à démarrer (quelques secondes contre plusieurs minutes pour une VM). Un conteneur typique utilise quelques dizaines de Mo de RAM contre plusieurs Go pour une VM.
Écrire un Dockerfile optimisé
Un Dockerfile bien écrit produit des images légères, rapides à construire et sécurisées. Voici les bonnes pratiques que nous appliquons chez MapWay :
Multi-stage builds
Le multi-stage build est la technique la plus importante pour réduire la taille de vos images. Le principe est d'utiliser plusieurs étapes de construction : une première étape installe les dépendances de développement et compile le code, tandis que la seconde étape copie uniquement les artefacts de production dans une image de base minimale. Pour une application Node.js, cette technique peut réduire la taille de l'image de 1 Go à moins de 200 Mo.
Ordre des couches et cache
Docker met en cache chaque couche (instruction) du Dockerfile. Si une couche n'a pas changé, Docker réutilise le cache au lieu de la reconstruire. Placez donc les instructions qui changent le moins souvent en premier (installation des dépendances système, copie du package.json et npm install) et celles qui changent fréquemment en dernier (copie du code source). Ainsi, un changement de code ne déclenche pas la réinstallation des dépendances.
Sécurité de l'image
Utilisez des images de base officielles et épurées (alpine pour les images les plus légères, slim pour un bon compromis). N'exécutez jamais votre application en tant que root dans le conteneur — créez un utilisateur dédié. Scannez régulièrement vos images avec des outils comme Trivy ou Docker Scout pour détecter les vulnérabilités connues dans vos dépendances.
Docker Compose : orchestrer plusieurs services
Une application moderne se compose rarement d'un seul service. Docker Compose permet de définir et d'exécuter des applications multi-conteneurs à l'aide d'un fichier YAML. Pour notre plateforme TMaps, un fichier docker-compose.yml typique définit les services suivants :
- api : le serveur Node.js/Express qui expose les endpoints REST
- db : PostgreSQL avec l'extension PostGIS pour les données spatiales
- redis : le cache et la gestion des sessions
- tile-server : un serveur de tuiles vectorielles pour les cartes
- nginx : le reverse proxy qui gère le SSL et le load balancing
Docker Compose gère automatiquement la création du réseau interne entre les services, les volumes persistants pour les données, et l'ordre de démarrage avec les dépendances entre services (depends_on). En développement, une seule commande — docker compose up — lance l'ensemble de l'infrastructure.
Volumes et persistance des données
Les conteneurs sont éphémères par nature : quand un conteneur est supprimé, ses données disparaissent avec lui. Les volumes Docker résolvent ce problème en montant des répertoires persistants du système hôte dans le conteneur. Pour les bases de données, les fichiers uploadés et les logs, les volumes sont indispensables. Distinguez les volumes nommés (gérés par Docker) des bind mounts (répertoires du système hôte), chacun ayant ses cas d'usage spécifiques.
Déployer en production
Le passage du développement à la production avec Docker nécessite quelques ajustements importants :
- Variables d'environnement : utilisez des fichiers .env séparés pour chaque environnement et ne stockez jamais de secrets dans l'image.
- Health checks : configurez des vérifications de santé pour que Docker redémarre automatiquement les conteneurs défaillants.
- Logging centralisé : redirigez les logs vers stdout/stderr et collectez-les avec un outil comme Loki ou l'ELK stack.
- Réseau et sécurité : exposez uniquement les ports nécessaires, utilisez des réseaux Docker dédiés et configurez le firewall du système hôte.
Docker pour les applications cartographiques
Chez MapWay, Docker nous apporte des avantages spécifiques pour nos projets cartographiques. Les serveurs de tuiles comme TileServer GL, les instances GeoServer et les bases PostGIS sont des composants complexes à installer et configurer. Avec Docker, chaque composant est isolé, versionné et reproductible. Un nouveau développeur peut avoir l'ensemble de l'infrastructure cartographique fonctionnelle en moins de 10 minutes avec un simple docker compose up.
Les mises à jour sont également simplifiées : nous construisons une nouvelle image, la testons en staging, puis la déployons en production en remplaçant simplement le conteneur. En cas de problème, le rollback à la version précédente est instantané.
Au-delà de Docker : Kubernetes
Pour les applications nécessitant une haute disponibilité et une mise à l'échelle automatique, Kubernetes (K8s) est la prochaine étape après Docker Compose. Kubernetes orchestre des clusters de conteneurs, gère le load balancing, les rolling updates et le self-healing. Bien que plus complexe, Kubernetes est l'aboutissement logique d'une stratégie de conteneurisation. Chez MapWay, nous utilisons Kubernetes pour nos services à fort trafic et Docker Compose pour les projets de taille moyenne.
Articles similaires
Besoin d'aide pour conteneuriser votre application ?
Notre équipe DevOps peut vous accompagner dans la mise en place de Docker pour vos projets.
Contactez-nous