Comment utiliser la commande docker compose port pour trouver les ports mappés

DockerDockerBeginner
Pratiquer maintenant

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Dans ce labo (LabEx), vous apprendrez à utiliser la commande docker port pour découvrir le port public mappé à un service Docker. Nous commencerons par créer un service simple avec un mappage de ports en utilisant l'image nginx.

Après la création du service, vous explorerez comment trouver le port public pour l'ensemble du service, pour un protocole spécifique et pour un index particulier de conteneur au sein du service. Cette expérience pratique vous dotera des compétences nécessaires pour identifier programmatiquement les ports exposés de vos conteneurs Docker.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/port("List Container Ports") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") docker/ImageOperationsGroup -.-> docker/images("List Images") subgraph Lab Skills docker/run -.-> lab-555085{{"Comment utiliser la commande docker compose port pour trouver les ports mappés"}} docker/ps -.-> lab-555085{{"Comment utiliser la commande docker compose port pour trouver les ports mappés"}} docker/port -.-> lab-555085{{"Comment utiliser la commande docker compose port pour trouver les ports mappés"}} docker/pull -.-> lab-555085{{"Comment utiliser la commande docker compose port pour trouver les ports mappés"}} docker/images -.-> lab-555085{{"Comment utiliser la commande docker compose port pour trouver les ports mappés"}} end

Créer un service simple avec mappage de ports

Dans cette étape, nous allons apprendre à créer un service simple avec Docker et mapper un port du conteneur vers la machine hôte. Cela permet un accès externe au service exécuté dans le conteneur.

Commencez par télécharger l'image nginx depuis Docker Hub. Cette image contient un serveur web léger que nous utiliserons pour notre exemple.

docker pull nginx

Vous devriez voir une sortie indiquant que l'image est en cours de téléchargement. Une fois le téléchargement terminé, vous pouvez vérifier que l'image est disponible localement en listant les images :

docker images

Maintenant, lançons un conteneur basé sur l'image nginx et mappons le port 80 du conteneur vers le port 8080 sur la machine hôte. Le flag -d exécute le conteneur en mode détaché (en arrière-plan), et le flag -p 8080:80 effectue le mappage de ports.

docker run -d -p 8080:80 nginx

Cette commande démarre un serveur web Nginx dans un conteneur Docker et le rend accessible sur le port 8080 de votre VM LabEx.

Pour vérifier que le conteneur est en cours d'exécution et que le mappage de ports fonctionne, vous pouvez utiliser la commande docker ps pour lister les conteneurs en cours d'exécution. Recherchez le conteneur exécutant l'image nginx et vérifiez la colonne PORTS. Vous devriez voir 0.0.0.0:8080->80/tcp.

docker ps

Enfin, vous pouvez accéder à la page d'accueil Nginx en utilisant curl pour faire une requête à localhost sur le port 8080.

curl localhost:8080

Vous devriez voir le contenu HTML de la page d'accueil par défaut de Nginx dans la sortie. Cela confirme que le conteneur est en cours d'exécution et accessible via le port mappé.

Trouver le port public du service

Dans l'étape précédente, nous avons créé un conteneur Docker et mappé un port du conteneur vers l'hôte. Maintenant, apprenons comment trouver programmatiquement le port public sur lequel un service est exposé. Ceci est utile lorsque vous ne vous souvenez plus explicitement quel port hôte vous avez mappé vers le port interne du conteneur.

La commande docker port est spécialement conçue pour cet usage. Elle affiche les mappages de ports pour un conteneur donné. Vous devez fournir l'ID ou le nom du conteneur comme argument.

D'abord, récupérons l'ID du conteneur Nginx en cours d'exécution. Vous pouvez utiliser docker ps et filtrer la sortie, ou simplement copier l'ID depuis la sortie de la commande docker ps de l'étape précédente.

docker ps

Recherchez le conteneur exécutant l'image nginx et notez son ID de conteneur.

Maintenant, utilisez la commande docker port suivie de l'ID du conteneur pour voir les mappages de ports.

docker port [CONTAINER_ID]

Remplacez [CONTAINER_ID] par l'ID réel de votre conteneur Nginx.

La sortie affichera le port interne du conteneur et le port hôte correspondant auquel il est mappé. Par exemple, vous devriez voir quelque chose comme 80/tcp -> 0.0.0.0:8080. Cela indique que le port interne 80 du conteneur (utilisant le protocole TCP) est mappé vers le port 8080 sur toutes les interfaces hôte (0.0.0.0).

Cette commande offre un moyen rapide de déterminer le port public sans avoir à inspecter toute la configuration du conteneur.

Trouver le port public pour un protocole spécifique

Dans l'étape précédente, nous avons utilisé docker port pour trouver tous les mappages de ports d'un conteneur. Parfois, un conteneur peut exposer plusieurs ports utilisant différents protocoles (comme TCP et UDP). Dans cette étape, nous allons apprendre à trouver le port public pour un protocole spécifique.

La commande docker port permet de spécifier le port interne du conteneur et le protocole qui vous intéresse. Le format est docker port [CONTAINER_ID] [CONTAINER_PORT]/[PROTOCOL].

Trouvons le port public pour le port interne 80 du conteneur Nginx en utilisant le protocole TCP. D'abord, assurez-vous d'avoir l'ID du conteneur de l'étape précédente. Si ce n'est pas le cas, vous pouvez le récupérer à nouveau avec docker ps.

docker ps

Maintenant, utilisez la commande docker port avec l'ID du conteneur et le port/protocole spécifique :

docker port [CONTAINER_ID] 80/tcp

Remplacez [CONTAINER_ID] par l'ID réel de votre conteneur Nginx.

La sortie devrait directement afficher le port hôte mappé au port interne 80 du conteneur pour le protocole TCP, qui est 0.0.0.0:8080. Ceci est plus spécifique que d'exécuter simplement docker port [CONTAINER_ID], qui listerait tous les mappages.

Cette méthode est particulièrement utile lorsqu'un conteneur expose le même numéro de port pour différents protocoles, et que vous n'avez besoin que du mappage pour l'un d'entre eux.

Trouver le port public pour un index spécifique de conteneur

Dans certains scénarios avancés, un conteneur peut exposer plusieurs fois le même port interne, potentiellement mappé à différents ports hôtes ou interfaces. Bien que moins courant pour des services simples comme Nginx, c'est possible. Dans ces cas, la commande docker port peut retourner plusieurs mappages pour un seul port interne.

Pour récupérer un mappage spécifique lorsque plusieurs existent, vous pouvez utiliser un index. Le résultat de docker port pour un port interne donné est une liste de mappages. Vous pouvez accéder à un mappage spécifique par son index, en commençant à 0.

Supposons, à titre de démonstration, que notre conteneur Nginx ait plusieurs mappages pour le port 80. Pour obtenir le premier mappage (index 0), vous utiliseriez le format de commande suivant :

docker port [CONTAINER_ID] [CONTAINER_PORT]/[PROTOCOL]/[INDEX]

En reprenant notre exemple Nginx, pour obtenir le premier mappage du port interne 80 en TCP, vous utiliseriez :

docker port [CONTAINER_ID] 80/tcp/0

Remplacez [CONTAINER_ID] par l'ID réel de votre conteneur Nginx.

Comme notre conteneur Nginx n'a qu'un seul mappage pour le port 80/tcp, cette commande retournera le même résultat que docker port [CONTAINER_ID] 80/tcp, soit 0.0.0.0:8080.

Bien que cet exemple spécifique avec Nginx ne montre pas pleinement l'utilité de l'indexation (puisqu'il n'y a qu'un seul mappage), comprendre cette fonctionnalité est important pour des configurations de conteneurs plus complexes où plusieurs mappages pour le même port interne pourraient exister.

Résumé

Dans ce labo, nous avons appris à créer un service Docker simple avec mappage de ports en téléchargeant une image Nginx, en exécutant un conteneur et en mappant le port 80 du conteneur vers le port 8080 de l'hôte. Nous avons vérifié l'état du conteneur et le mappage des ports en utilisant docker ps et confirmé l'accessibilité en interrogeant le port mappé de l'hôte avec curl.

Nous avons ensuite exploré comment trouver programmatiquement le port public d'un service en utilisant la commande docker port, ce qui est particulièrement utile lorsque le mappage des ports de l'hôte n'est pas explicitement connu. Cette commande nous permet de récupérer le port de l'hôte correspondant à un port interne du conteneur.