Contactez-nous

Problème : impossible d'accéder à l'application dans le conteneur

Diagnostiquez pourquoi vous ne pouvez pas accéder à une application web ou service dans un conteneur Docker, malgré son exécution. Vérifiez le mapping de ports, les logs et les pare-feux.

Mon conteneur tourne, mais mon application est injoignable

C'est un scénario classique : vous avez lancé avec succès un conteneur, par exemple un serveur web ou une API. La commande `docker ps` vous confirme qu'il est bien en état `Up` (En cours d'exécution). Cependant, lorsque vous essayez d'accéder à l'application via votre navigateur web (ex: `http://localhost:8080`) ou un autre client, la connexion échoue, avec un message comme "Ce site est inaccessible" ou "Connexion refusée".

Cette situation peut être frustrante car le conteneur semble fonctionner correctement de l'extérieur. Le problème réside souvent dans la communication entre votre machine hôte et l'application à l'intérieur du conteneur. Plusieurs facteurs peuvent en être la cause, allant d'une simple erreur de configuration du mapping de ports à des blocages par des pare-feux ou des problèmes internes à l'application.

Pour résoudre ce problème, une approche méthodique est nécessaire, en vérifiant chaque maillon de la chaîne de communication, de votre machine hôte jusqu'au processus applicatif dans le conteneur.

Identifier les causes potentielles de l'inaccessibilité

Plusieurs raisons peuvent expliquer pourquoi l'application dans votre conteneur n'est pas accessible depuis l'extérieur :

1. Mapping de ports manquant ou incorrect : C'est la cause la plus fréquente. Vous avez peut-être oublié d'utiliser l'option `-p HOST_PORT:CONTAINER_PORT` (ou `-P` pour un mapping automatique) lors du `docker run`, ou les numéros de ports spécifiés sont incorrects. Sans ce mapping, Docker ne sait pas comment rediriger le trafic de votre hôte vers le conteneur.

2. Application non démarrée ou en erreur : Le conteneur est peut-être en cours d'exécution, mais l'application elle-même a échoué à démarrer correctement ou est bloquée par une erreur interne. Elle n'écoute donc pas sur le port attendu.

3. Application écoutant sur la mauvaise interface : Parfois, l'application à l'intérieur du conteneur est configurée pour n'écouter que sur `localhost` (ou `127.0.0.1`). Dans l'environnement isolé du conteneur, cela signifie qu'elle n'acceptera pas les connexions venant de l'extérieur du conteneur (même celles redirigées par Docker). Elle doit écouter sur `0.0.0.0` ou sur l'adresse IP spécifique du conteneur pour être accessible via le mapping de ports.

4. Pare-feu de la machine hôte : Le pare-feu de votre système d'exploitation (Windows Firewall, `ufw` ou `firewalld` sous Linux, le pare-feu macOS) pourrait bloquer les connexions entrantes sur le `HOST_PORT` que vous essayez d'utiliser.

5. Pare-feu à l'intérieur du conteneur : Bien que moins courant dans les images de base, il est possible que le conteneur lui-même exécute un pare-feu qui bloque le `CONTAINER_PORT`.

6. Problème de réseau Docker : Dans des configurations plus complexes, des problèmes liés aux réseaux Docker personnalisés pourraient intervenir, mais c'est moins probable pour un simple mapping de port.

Démarche de diagnostic étape par étape

Pour isoler et résoudre le problème, suivez ces étapes :

1. Vérifier le statut et le mapping des ports du conteneur : Utilisez `docker ps` pour confirmer que le conteneur est bien `Up` et examinez attentivement la colonne `PORTS`. Assurez-vous que le mapping attendu (ex: `0.0.0.0:8080->80/tcp`) est présent et correct. Si rien n'apparaît ou si le mapping est faux, vous devrez arrêter (`docker stop`) et supprimer (`docker rm`) le conteneur, puis le relancer avec la bonne option `-p`. Vous pouvez aussi utiliser `docker port ` pour voir spécifiquement les mappings d'un conteneur.

2. Consulter les logs de l'application (`docker logs`) : Utilisez `docker logs `. Recherchez des messages d'erreur indiquant que l'application n'a pas pu démarrer, qu'elle n'écoute pas sur le bon port, ou qu'elle rencontre d'autres problèmes. Suivre les logs en temps réel avec `-f` pendant que vous tentez de vous connecter peut aussi révéler des erreurs.

3. Tester la connectivité à l'intérieur du conteneur (`docker exec`) : C'est une étape cruciale. Ouvrez un shell dans le conteneur :

docker exec -it  bash # ou sh
Une fois à l'intérieur, essayez d'accéder à l'application localement. Installez `curl` ou `wget` si nécessaire (ex: `apt-get update && apt-get install curl` sur Debian/Ubuntu, `apk add curl` sur Alpine).
# Test avec le port interne du conteneur (ex: 80)
curl http://localhost:80
# ou
curl http://127.0.0.1:80
Si cette commande échoue, le problème vient de l'application elle-même ou de sa configuration interne (elle n'écoute peut-être pas ou pas sur la bonne interface). Vérifiez si le processus écoute bien sur `0.0.0.0:CONTAINER_PORT` (ou `:::CONTAINER_PORT` pour IPv6) avec `netstat -tulnp` (si disponible).

4. Vérifier le pare-feu de l'hôte : Si le test interne (`curl localhost:PORT`) réussit, le problème se situe probablement entre l'hôte et le conteneur. Essayez de désactiver temporairement le pare-feu de votre machine hôte et testez à nouveau l'accès depuis votre navigateur. Si cela fonctionne, réactivez le pare-feu et ajoutez une règle spécifique pour autoriser le trafic entrant sur le `HOST_PORT` utilisé dans votre commande `docker run -p`.

5. Vérifier l'adresse d'accès : Assurez-vous que vous utilisez la bonne adresse dans votre navigateur. Si Docker tourne directement sur votre machine, `http://localhost:HOST_PORT` ou `http://127.0.0.1:HOST_PORT` devrait fonctionner. Si Docker tourne dans une VM (comme avec Docker Toolbox ou certaines configurations Linux), vous devrez utiliser l'adresse IP de la VM.

En suivant ces étapes, vous devriez être capable d'identifier si le problème vient du mapping de ports, de l'application elle-même, de sa configuration d'écoute, ou d'un blocage par un pare-feu, et ainsi le corriger.