Introduction
Exécuter une API Express dans un conteneur est simple, mais rendre le service accessible et observable d'un environnement à l'autre révèle souvent des hypothèses cachées. Ce guide présente les étapes exactes de configuration, les commandes qui prouvent que chaque élément fonctionne, et les signaux d'erreur qui apparaissent en cas de mauvaise configuration. L'accent est mis sur le réseau de l'API Express, le DNS de l'API Express, les ports de l'API Express, la connectivité de l'API Express et le dépannage réseau de l'API Express afin de passer d'un checkout local à un pipeline CI/CD sans surprise.
Aperçu du workflow
- Identifier la ressource à configurer — par exemple le processus Express qui écoute sur un port TCP à l'intérieur d'un conteneur.
- Appliquer un seul changement de configuration — comme définir
PORT=3000dans l'environnement du conteneur ou ajouter un nom de serviceapidans un fichier Docker Compose. - Lancer une commande de vérification qui renvoie un résultat déterministe — par exemple
curl -s http://api:3000/healthdoit retourner{"status":"ok"}lorsque le chemin réseau est correct. - Documenter le mode de défaillance — si la commande curl bloque, expire ou renvoie
connection refused, vous savez exactement quelle couche (DNS, liaison de port, pare-feu ou application) est défaillante.
En pratique, le workflow met en lumière des hypothèses sur les chemins locaux, les tags d'image, les noms de réseau, les fichiers d'environnement, les limites de ressources et les permissions de fichiers. Rendez ces hypothèses explicites en les écrivant à côté du Dockerfile ou du fichier compose. Un test local répétable doit pouvoir être exécuté par un autre développeur à partir d'un clone propre du dépôt avec seulement les commandes documentées.
Exemple concret
- Dockerfile : exposer le port 3000 et démarrer l'application avec
node server.jsoùserver.jslitprocess.env.PORT || 3000. - docker-compose.yml : définir un réseau
appnetet un serviceapiqui rejointappnet. Le nom du service devient le nom d'hôte DNS pour les autres conteneurs. - Vérification : depuis un second conteneur sur
appnetexécuterdocker exec -it client sh -c "curl -s http://api:3000/health". Résultat attendu :{"status":"ok"}. - Signaux de défaillance :
curl: (6) Could not resolve host: api→ problème DNS ou d'attachement au réseau.curl: (7) Failed to connect to api port 3000: Connection refused→ Express n'écoute pas sur le port 3000 ou le port du conteneur n'est pas publié.curl: (28) Operation timed out→ pare-feu ou groupe de sécurité bloquant le trafic.
Plan de pilote local
Utilisez la même boucle en trois étapes sur un seul service avant d'ajouter bases de données, files d'attente ou équilibreurs de charge.
- Définir les entrées attendues – variable d'environnement
PORT=3000, nom de réseauappnet, nom de serviceapi. - Appliquer la configuration – ajouter le réseau et le service à
docker-compose.yml, reconstruire avecdocker compose up --build -d. - Exécuter les commandes de vérification –
docker compose exec api sh -c "ss -ltnp | grep :3000"– doit afficher le processus Node en écoute sur0.0.0.0:3000.docker compose exec api cat /etc/hosts– doit contenir une entrée associantapià l'IP interne du conteneur.docker compose run --rm client curl -s http://api:3000/health– doit retourner la charge JSON de santé.
- Capturer les signaux de défaillance – enregistrer le texte exact de chaque erreur pour les commandes ci-dessus. Stocker les commandes et les sorties attendues dans un fichier
docs/local-pilot.mdà côté du fichier compose afin que le test soit répétable.
Lorsque le pilote réussit, vous disposez d'une base validée : le processus Express lie le bon port, le DNS du conteneur résout le nom de service, et le chemin réseau autorise le trafic TCP. Tout changement ultérieur — ajout d'un reverse proxy, changement d'image de base, migration vers Kubernetes — peut être validé par rapport à cette base.
Conclusion
Le dépannage réseau de l'API Express fonctionne le mieux lorsque la configuration est traitée comme du code testable. Maintenez les étapes de vérification petites, exécutez-les localement à chaque modification, et comparez le comportement observé aux critères de succès documentés. L'étape suivante consiste à choisir un service supplémentaire — par exemple un jeu de réplicas MongoDB — et à appliquer la même boucle définir‑appliquer‑vérifier. Documentez les commandes exactes de build, run, inspect, stop et recreate pour que l'ensemble de la pile reste reproductible à partir d'un checkout propre. Un flux de travail conteneurisé fiable rend l'échec visible : les logs sont faciles à localiser, les données persistantes survivent aux reconstructions de conteneurs, et le comportement local reflète suffisamment la production pour détecter les erreurs tôt.