Skip to main content

La gestion des ports

Redirection des ports

La plupart des applications dockerisées écoutent sur des ports spécifiques. Par exemple : serveurs web, bases de données, API, etc.

Pour les rendre accessibles depuis l'extérieur, il faut rediriger ces ports avec l'option --port, -p.
Cette option permet de lier un port du conteneur à un port de la machine hôte.

Dans le détail, lorsqu'une requête est envoyée à un port de la machine hôte, Docker la redirige automatiquement vers le port correspondant à l'intérieur du conteneur.

La syntaxe de -p est la suivante :

-p [IP:]PORT_HOTE:PORT_CONTENEUR
  • PORT_CONTENEUR : le port sur lequel l'application à l'intérieur du conteneur écoute.
  • PORT_HOTE : le port de la machine hôte sur lequel les requêtes externes seront reçues.
  • IP (facultative) : permet de restreindre l'accès à une IP spécifique, par exemple 127.0.0.1.

La redirection de ports docker permet de répondre à des cas d'usages fréquents : contrôle d'accès aux applications, gestion des conflits de port avec des applications similaires, configuration d'architectures réseaux complexes, etc.

Exemples avec strm/helloworld-http

L'image  🔗 strm/helloworld-http permet d'afficher un message test et écoute sur le port 80, port HTTP par défaut.

Une fois lancé, un docker ps -a nous confirme que le port 80 du conteneur est ouvert.

image.png

image.png

Néanmoins, le port 80 de la machine hôte ne répond pas :

image.png

Le port 80 de la machine hôte n'est pas automatiquement redirigé vers celui du conteneur.

Il faut lancer le container avec l'argument -p. Il est tout à fait possible d'indiquer un autre port pour l'hôte, par exemple 90.

image.png

Un docker ps -a nous confirme que le port 90 de la machine hôte est redirigé vers le port 80 du conteneur.

image.png

La page web est accessible depuis 127.0.0.1:90. Elle est également accessible depuis le LAN, toujours sur le port 90.

image.png

Il est possible de n'écouter que depuis l'IP 127.0.0.1 avec -p 127.0.0.1:90:80.

image.png

Cela peut-être utile pour faire fonctionner une application derrière un reverse proxy (traefik, apache, nginx, etc.) afin de lui attribuer un nom de domaine.