La différence entre Port Externe et Port Interne
Dans la section précédente, nous avons appris à récupérer des images Docker. Maintenant, nous allons voir comment accéder aux applications qui tournent dans nos conteneurs.
Car oui, lancer un conteneur est une chose… mais y accéder depuis son navigateur en est une autre.
Pour comprendre cela, il faut parler d’un concept essentiel : le mapping de ports.
Le problème : un conteneur est isolé
Par défaut, un conteneur Docker fonctionne dans son propre environnement réseau isolé.
Cela signifie que même si un service fonctionne parfaitement à l’intérieur du conteneur, il n’est pas accessible depuis votre machine ou depuis Internet.
Prenons un exemple simple.
Vous lancez un conteneur avec un serveur web qui écoute sur le port 80.
Dans le conteneur :
http://localhost:80
fonctionne parfaitement.
Mais depuis votre ordinateur :
http://localhost
… rien ne répond.
Pourquoi ?
Parce que le port 80 du conteneur n’est pas exposé vers l’extérieur.
C’est exactement là qu’intervient le mapping de ports.
Le principe : relier deux ports
Le mapping de ports consiste à relier un port de votre machine (l’hôte) à un port du conteneur.
On parle alors de :
- Port externe (Host Port) → le port de votre machine
- Port interne (Container Port) → le port utilisé par l’application dans le conteneur
Visuellement, cela donne :
Votre ordinateur Conteneur Docker
--------------- -----------------
localhost:8080 ---> nginx:80
(port externe) (port interne)
Dans cet exemple :
- votre navigateur accède à localhost:8080
- Docker redirige vers le port 80 du conteneur
La syntaxe avec docker run
Le mapping de ports se fait avec l’option -p :
docker run -p PORT_EXTERNE:PORT_INTERNE image
Exemple concret avec un serveur web Nginx :
docker run -p 8080:80 nginx
Cela signifie :
- le port 8080 de votre machine
- est redirigé vers le port 80 du conteneur
Vous pouvez alors ouvrir votre navigateur sur :
http://localhost:8080
Et voir la page web de Nginx.
Pourquoi ne pas utiliser directement le port 80 ?
On pourrait se dire :
« Pourquoi ne pas faire simplement 80:80 ? »
C’est possible :
docker run -p 80:80 nginx
Mais utiliser des ports différents présente plusieurs avantages.
Cela permet notamment de :
- éviter les conflits si un service utilise déjà le port 80
- lancer plusieurs applications web en parallèle
- tester des environnements de développement
Par exemple :
8080 → site de test
8081 → API
8082 → outil interne
Tous ces services peuvent tourner en même temps sur la même machine.
Une analogie simple : l’immeuble
Imaginez un immeuble.
- L’adresse de l’immeuble = votre machine
- Les appartements = les conteneurs
- Les numéros de porte = les ports
Quand quelqu’un arrive à l’immeuble, il doit savoir quelle porte appeler.
Docker agit comme un standardiste :
« Si quelqu’un appelle au port 8080, je le redirige vers l’appartement qui écoute sur le port 80. »
Vérifier les ports exposés
Pour voir quels ports sont utilisés par vos conteneurs :
docker ps
Vous verrez une colonne PORTS ressemblant à ceci :
0.0.0.0:8080->80/tcp
Cela signifie :
- 8080 sur votre machine
- redirigé vers 80 dans le conteneur
À retenir
Le mapping de ports est l’un des mécanismes les plus importants de Docker.
Sans lui :
- vos conteneurs fonctionnent
- mais personne ne peut y accéder
Retenez simplement cette règle : PORT_EXTERNE → PORT_INTERNE
⚡ Astuce pour la suite : Nous le verrons plus tard dans cette formation, il sera possible d’exposer nos applications web sans transfert de port direct, grâce à un service supplémentaire : le reverse proxy Traefik, qui se chargera de router les requêtes vers le bon conteneur automatiquement.
Dans la prochaine leçon, nous allons voir un point qui crée beaucoup de confusion chez les débutants : la différence entre EXPOSE et PORTS.
Spoiler : EXPOSE n’ouvre pas réellement le port. 😈