Pourquoi EXPOSE ne suffit pas pour accéder à mon site ?
Maintenant que nous avons vu le mapping de ports, il est important de comprendre la différence entre deux notions souvent confondues :
EXPOSEdans le Dockerfile-pou--publishdansdocker run
EXPOSE : une simple déclaration
EXPOSE sert à indiquer quel port le conteneur utilise.
Exemple dans un Dockerfile :
FROM nginx
EXPOSE 80
- Cela ne crée pas de redirection vers l’extérieur.
- C’est une sorte de documentation pour Docker et pour les développeurs.
Pensez à
EXPOSEcomme un post-it sur la porte : “Ce conteneur écoute sur le port 80”.
Mais le post-it ne fait pas sortir le signal à l’extérieur.
-p/--publish : le vrai transfert
Pour que votre site soit accessible depuis votre machine ou Internet, il faut mapper le port interne à un port externe avec :
docker run -p PORT_EXTERNE:PORT_INTERNE image
Exemple concret avec Nginx :
docker run -p 8080:80 nginx
8080→ votre machine80→ port interne du conteneur
Sans cette étape, même si le Dockerfile contient EXPOSE 80, personne ne pourra accéder à votre site.
Comparaison rapide
| Fonction | EXPOSE | -p / –publish |
|---|---|---|
| Indique le port du service | ✅ | ❌ (optionnel) |
| Rend le port accessible depuis l’extérieur | ❌ | ✅ |
| Utilité | Documentation et bonnes pratiques | Transfert effectif de port |
Exemple concret
Dockerfile :
FROM nginx
EXPOSE 80
- Le conteneur écoute sur le port 80.
- Mais
EXPOSEseul ne rend pas le port accessible depuis votre machine.
Commande de lancement sans mapping :
docker run nginx
- Le conteneur démarre, le port 80 existe à l’intérieur, mais
vous ne pouvez pas accéder à Nginx depuis votre navigateur (http://localhostne fonctionne pas).
Commande de lancement avec mapping de ports :
docker run -p 8080:80 nginx
- Docker redirige le port 8080 de votre machine vers le port 80 du conteneur.
- Vous pouvez maintenant ouvrir votre navigateur sur :
http://localhost:8080
- Et accéder à votre site Nginx.
Schéma visuel simplifié
Votre machine Conteneur Docker
--------------- -----------------
localhost:8080 ---> nginx:80
(port externe) (port interne)
- Sans
-p: aucune flèche → inaccessible - Avec
-p: flèche vers le conteneur → accessible
EXPOSE indique juste que le port existe,
-peffectue la redirection réelle.