3.2. Publication de ports

Nous avons vu comment lancer un container, mais en l’état, ce container n’est pas accessible de l’extérieur de l’hôte, et n’est donc pas très utile pour mettre un service à disposition des utilisateurs.  
Pour répondre à ce besoin, Docker utilise (à nouveau) des outils Linux pour permettre à des clients extérieurs de joindre des services tournant à l’intérieur d’un container, via le mécanisme de publication de ports.  Il s’agit tout simplement d’un service de traduction/redirection de ports : Lorsqu’un paquet est reçu pour un service donné (via le port correspondant) sur l’adresse de l’hôte, il est transféré à la couche Docker qui va elle-même le transmettre au container correspondant, sur le port ad-hoc.  
La publication de port va donc relier un port (tcp ou udp) sur l’hôte et un port (éventuellement différent) sur le container.  

La publication de port doit s’effectuer lors du démarrage du container.  On utilisera pour cela l’option “-p” (pour publish), à laquelle on joint d’abord le numéro de port sur hôte (source), puis le numéro de port sur le container (destination). Par défaut, il s’agit de ports TCP.  Pour indiquer une publication de port UDP, il faut l’indiquer à la suite des numéros de ports.  

docker run -p <host port>:<container port>[/udp] <container>

Illustration

Dans notre exemple, nous aimerions que notre serveur Web puisse être accessible de l’extérieur de l’hôte. Imaginons que l’hôte héberge déjà un service sur le port 80. Nous allons donc utiliser le port 3000 de l’hôte pour notre serveur web, et faire en sorte que le traffic reçu sur ce port 3000 soit redirigé vers le port 80 du container : 

docker run -d -p 3000:80 --name web nginx

Publication de port

A présent, notre service sera accessible sur l’adresse IP de l’hôte, via le port 3000 (http://<host IP>:3000/). Dans l’exemple ci-dessous, le client lynx utilise l’adresse locale de l’hôte et son port 3000, qui est donc redirigé vers l’adresse IP interne du container, sur le port 80.

Screencast montrant le lancement d'un container avec publication de port