Comment inspecter les ports exposés d'un conteneur Docker

DockerBeginner
Pratiquer maintenant

Introduction

Docker est une technologie de conteneurisation largement adoptée qui a révolutionné la manière dont les applications sont développées, empaquetées et déployées. Comprendre les ports exposés d'un conteneur Docker est un aspect fondamental du travail avec Docker, car cela vous permet d'accéder aux services s'exécutant à l'intérieur du conteneur et d'interagir avec eux. Ce tutoriel vous guidera à travers le processus d'inspection des ports exposés d'un conteneur Docker, vous permettant de mieux gérer et optimiser vos applications conteneurisées.

Comprendre les Ports des Conteneurs Docker

Avant de nous plonger dans l'inspection des ports des conteneurs, comprenons d'abord ce que sont les ports et pourquoi ils sont importants dans les conteneurs Docker.

Que sont les Ports des Conteneurs

Dans Docker, les ports permettent aux services s'exécutant à l'intérieur d'un conteneur de communiquer avec le monde extérieur. Considérez les ports comme des portes vers votre application conteneurisée - sans ouvrir ces portes, personne ne peut accéder aux services à l'intérieur.

Types de Configurations de Ports

Docker prend en charge deux principaux types de configurations de ports :

  1. Ports Exposés (Exposed Ports) : Ports qu'un conteneur rend disponibles pour des connexions potentielles, mais qui ne sont pas automatiquement accessibles depuis l'hôte.

  2. Ports Publiés (Published Ports) : Ports exposés qui sont mappés à un port sur l'hôte, permettant un accès externe aux services du conteneur.

Exécutons un simple conteneur de serveur web pour mieux comprendre cela :

docker run -d --name web-demo nginx

Exécutez cette commande dans le terminal. Cela démarre un conteneur de serveur web Nginx nommé web-demo en mode détaché (s'exécutant en arrière-plan).

La sortie affichera un ID de conteneur, similaire à :

3a6e8df899a9b723de9e4684542dc9987af26381118fa36496757d17ac952c9f

Ce conteneur Nginx a le port 80 exposé par défaut (comme défini dans son Dockerfile), mais nous ne l'avons pas encore publié sur l'hôte, nous ne pouvons donc pas y accéder de l'extérieur.

Examiner la Configuration des Ports du Conteneur

Maintenant que notre conteneur est en cours d'exécution, examinons sa configuration de ports.

Utilisation de docker ps pour Afficher les Mappages de Ports

La commande docker ps affiche les conteneurs en cours d'exécution et leurs configurations de ports.

Exécutez cette commande dans votre terminal :

docker ps

Vous verrez une sortie similaire à :

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
3a6e8df899a9   nginx     "/docker-entrypoint.…"   2 minutes ago    Up 2 minutes    80/tcp    web-demo

Remarquez la colonne PORTS. Elle affiche 80/tcp, indiquant que le port 80 est exposé mais non publié sur l'hôte.

Exécution d'un Conteneur avec des Ports Publiés

Arrêtons notre premier conteneur et créons-en un nouveau avec un port publié :

docker stop web-demo
docker rm web-demo

Maintenant, exécutez un nouveau conteneur avec un mappage de ports :

docker run -d --name web-demo -p 8080:80 nginx

L'option -p 8080:80 publie le port 80 du conteneur sur le port 8080 de l'hôte.

Exécutez docker ps à nouveau pour voir la différence :

docker ps

Sortie :

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                  NAMES
f7d483e51ef2   nginx     "/docker-entrypoint.…"   10 seconds ago   Up 10 seconds   0.0.0.0:8080->80/tcp   web-demo

Remarquez comment la colonne PORTS affiche maintenant 0.0.0.0:8080->80/tcp, indiquant que le port 80 dans le conteneur est mappé au port 8080 sur toutes les interfaces de l'hôte.

Inspection des Détails des Ports du Conteneur

Docker fournit plusieurs commandes pour inspecter en détail les configurations de ports des conteneurs. Explorons ces options.

Utilisation de la commande docker port

La commande docker port affiche les mappages de ports pour un conteneur :

docker port web-demo

Sortie :

80/tcp -> 0.0.0.0:8080

Ceci montre que le port 80/tcp dans le conteneur est mappé au port 8080 sur toutes les interfaces de l'hôte.

Utilisation de docker inspect pour des Informations Détaillées

Pour des informations plus détaillées, utilisez la commande docker inspect :

docker inspect web-demo

Cette commande produit une grande quantité de sortie JSON avec des informations détaillées sur le conteneur. Pour filtrer uniquement les informations de port, utilisez cette commande :

docker inspect --format='{{json .NetworkSettings.Ports}}' web-demo | jq

Si jq n'est pas installé, vous pouvez l'installer avec :

sudo apt-get update && sudo apt-get install -y jq

La sortie de la commande inspect filtrée ressemblera à :

{
  "80/tcp": [
    {
      "HostIp": "0.0.0.0",
      "HostPort": "8080"
    }
  ]
}

Ceci montre des informations détaillées sur le mappage des ports :

  • Port du conteneur : 80/tcp
  • IP de l'hôte : 0.0.0.0 (toutes les interfaces)
  • Port de l'hôte : 8080

Lister Tous les Ports des Conteneurs

Si vous avez plusieurs conteneurs, vous pouvez voir tous les mappages de ports avec :

docker ps --format "{{.Names}}: {{.Ports}}"

Sortie :

web-demo: 0.0.0.0:8080->80/tcp

Ceci est utile lors de la gestion de plusieurs conteneurs avec différentes configurations de ports.

Accéder aux Services via les Ports Exposés

Maintenant que nous comprenons comment inspecter les ports des conteneurs, accédons au serveur web en cours d'exécution dans notre conteneur.

Tester l'Accessibilité du Conteneur

Puisque nous avons mappé le port 80 du conteneur au port 8080 sur l'hôte, nous pouvons accéder au serveur web Nginx via le port 8080.

Utilisons la commande curl pour faire une requête à notre serveur web :

curl localhost:8080

Vous devriez voir le HTML de la page d'accueil de Nginx :

<!DOCTYPE html>
<html>
  <head>
    <title>Welcome to nginx!</title>
    <style>
      html {
        color-scheme: light dark;
      }
      body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
      }
    </style>
  </head>
  <body>
    <h1>Welcome to nginx!</h1>
    <p>
      If you see this page, the nginx web server is successfully installed and
      working. Further configuration is required.
    </p>

    <p>
      For online documentation and support please refer to
      <a href="http://nginx.org/">nginx.org</a>.<br />
      Commercial support is available at
      <a href="http://nginx.com/">nginx.com</a>.
    </p>

    <p><em>Thank you for using nginx.</em></p>
  </body>
</html>

Ceci confirme que nous pouvons accéder au serveur web Nginx en cours d'exécution à l'intérieur de notre conteneur via le port publié.

Exécution de Plusieurs Services

Créons un autre conteneur avec un service différent et un mappage de port :

docker run -d --name redis-demo -p 6379:6379 redis

Cette commande démarre un conteneur de base de données Redis et mappe son port par défaut 6379 au même port sur l'hôte.

Vérifiez les conteneurs en cours d'exécution :

docker ps

Sortie :

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                    NAMES
a45df67e21b3   redis     "docker-entrypoint.s…"   10 seconds ago   Up 10 seconds   0.0.0.0:6379->6379/tcp   redis-demo
f7d483e51ef2   nginx     "/docker-entrypoint.…"   10 minutes ago   Up 10 minutes   0.0.0.0:8080->80/tcp     web-demo

Nous avons maintenant deux conteneurs exécutant différents services, chacun avec son propre mappage de port.

Gestion des Configurations de Ports des Conteneurs

Maintenant que nous comprenons comment inspecter et accéder aux services conteneurisés, explorons quelques concepts supplémentaires de gestion des ports.

Scénarios Communs de Gestion des Ports

Voici quelques scénarios courants que vous pourriez rencontrer :

1. Modification des Mappages de Ports

Si le port 8080 est déjà utilisé sur votre hôte, vous pouvez mapper vers un port différent :

docker stop web-demo
docker rm web-demo
docker run -d --name web-demo -p 8081:80 nginx

Maintenant, le conteneur Nginx est accessible sur le port 8081 :

curl localhost:8081

2. Liaison à des Interfaces Spécifiques

Au lieu de se lier à toutes les interfaces (0.0.0.0), vous pouvez vous lier à une IP spécifique :

docker stop web-demo
docker rm web-demo
docker run -d --name web-demo -p 127.0.0.1:8080:80 nginx

Ceci lie le port du conteneur uniquement à l'interface localhost, le rendant inaccessible de l'extérieur de l'hôte.

3. Utilisation de Ports Hôtes Aléatoires

Si vous ne vous souciez pas du port hôte utilisé, laissez Docker en assigner un :

docker stop web-demo
docker rm web-demo
docker run -d --name web-demo -P nginx

L'option -P publie tous les ports exposés vers des ports aléatoires sur l'hôte.

Vérifiez le port assigné :

docker port web-demo

Sortie :

80/tcp -> 0.0.0.0:49153

Le numéro de port exact variera, mais dans cet exemple, le port 80 a été mappé au port 49153.

Dépannage des Problèmes de Ports Courants

Voici des solutions aux problèmes courants liés aux ports :

  1. Port déjà utilisé : Si vous voyez une erreur comme "port is already allocated", choisissez un port différent :
docker run -d --name another-web -p 8082:80 nginx
  1. Le conteneur ne peut pas se connecter à l'hôte : Si un conteneur doit se connecter à un service sur l'hôte, utilisez le nom DNS Docker spécial host.docker.internal au lieu de localhost :
docker run --rm alpine ping -c 2 host.docker.internal
  1. Vérification du processus qui utilise un port : Si un port est déjà utilisé sur l'hôte, trouvez le processus :
sudo lsof -i :8080

Nettoyage

Nettoyons nos conteneurs :

docker stop web-demo redis-demo
docker rm web-demo redis-demo

Résumé

Dans ce lab, vous avez appris à travailler avec les ports des conteneurs Docker, notamment :

  • Comprendre la différence entre les ports exposés et les ports publiés
  • Exécuter des conteneurs avec des mappages de ports spécifiques
  • Inspecter les configurations de ports des conteneurs à l'aide de diverses commandes Docker
  • Accéder aux services en cours d'exécution à l'intérieur des conteneurs via les ports mappés
  • Gérer et dépanner les scénarios courants liés aux ports

Ces compétences sont fondamentales pour travailler avec les conteneurs Docker et sont essentielles pour le déploiement d'applications conteneurisées dans les environnements de développement et de production. Grâce à ces connaissances, vous pouvez désormais configurer et gérer les aspects réseau de vos conteneurs Docker avec confiance.