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 :
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.
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 :
- 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
- 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.internalau lieu delocalhost:
docker run --rm alpine ping -c 2 host.docker.internal
- 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.



