
Problème : le port est déjà utilisé (`address already in use`)
Comprenez pourquoi l'erreur 'address already in use' survient avec `docker run -p` et apprenez à identifier et résoudre les conflits de ports sur votre machine hôte.
Comprendre l'erreur de conflit de port
L'un des messages d'erreur les plus fréquents lorsque l'on commence à lancer des conteneurs qui exposent des services réseau (comme des serveurs web) est lié à l'utilisation des ports. Vous lancez une commande `docker run` avec l'option `-p` (ou `--publish`) pour mapper un port du conteneur vers un port de votre machine hôte, et vous obtenez une réponse frustrante ressemblant à : `Error starting userland proxy: listen tcp4 0.0.0.0:XXXX: bind: address already in use` ou un message similaire indiquant qu'il est impossible de "binder" (lier) l'adresse.
Cette erreur signifie simplement que le port que vous essayez d'utiliser sur votre machine hôte (le premier numéro dans `-p HOST_PORT:CONTAINER_PORT`) est déjà occupé par un autre processus. Chaque port TCP ou UDP sur une machine ne peut être activement écouté que par un seul processus à la fois. Docker, en essayant d'écouter sur ce port pour rediriger le trafic vers votre conteneur, se heurte à ce conflit.
Il est crucial de comprendre que le conflit se situe sur la machine hôte (votre ordinateur), pas à l'intérieur du conteneur. Docker essaie de réserver le port spécifié sur votre système d'exploitation pour pouvoir y recevoir des connexions et les transmettre au conteneur.
Diagnostiquer quel processus utilise le port
La première étape pour résoudre ce problème est d'identifier quel autre processus utilise déjà le port en question sur votre machine hôte. Les commandes pour cela varient légèrement selon votre système d'exploitation.
Sur Linux : Vous pouvez utiliser `netstat`, `ss` ou `lsof`.# Remplacer XXXX par le numéro de port qui pose problème
sudo netstat -tulnp | grep XXXX
# ou
sudo ss -tulnp | grep XXXX
# ou
sudo lsof -i :XXXXCes commandes devraient vous montrer le nom du processus (ou son PID - Process ID) qui écoute sur le port.Sur macOS : La commande `lsof` est généralement la plus directe.# Remplacer XXXX par le numéro de port
sudo lsof -i :XXXXSur Windows : La commande `netstat` est disponible dans l'invite de commandes (cmd) ou PowerShell.# Remplacer XXXX par le numéro de port
netstat -ano | findstr "XXXX"
# L'option -o affiche le PID. Vous pouvez ensuite trouver le nom du processus
# correspondant au PID dans le Gestionnaire des tâches (onglet Détails).Une fois que vous avez identifié le processus (cela peut être un autre serveur web, une base de données, une autre instance Docker, etc.), vous pouvez décider de la marche à suivre.
Résoudre le conflit de port : deux approches
Il existe principalement deux façons de résoudre cette erreur :
1. Arrêter le processus conflictuel : Si le processus qui utilise le port n'est pas essentiel ou si vous pouvez l'arrêter temporairement, c'est la solution la plus simple. Utilisez les outils de votre système d'exploitation (commande `kill` sous Linux/macOS, Gestionnaire des tâches sous Windows) pour terminer le processus identifié à l'étape précédente. Une fois le port libéré, relancez votre commande `docker run`.
2. Utiliser un port différent sur l'hôte : C'est souvent la solution la plus pratique, surtout si le processus existant doit continuer à tourner. Au lieu de mapper le port du conteneur sur le port `XXXX` de l'hôte, choisissez un autre port libre sur votre machine. Par exemple, si vous vouliez faire `-p 80:80` pour un serveur web et que le port 80 est pris, vous pourriez utiliser le port 8080 sur l'hôte :
# Au lieu de : docker run -d -p 80:80 --name webserver nginx (qui échoue)
# Essayez : docker run -d -p 8080:80 --name webserver nginxDans ce cas, vous accéderez à votre application via `http://localhost:8080` (ou l'IP de votre machine hôte) au lieu de `http://localhost:80`. Le conteneur, lui, continuera d'écouter sur son port interne (80 dans cet exemple), mais Docker se chargera de la redirection depuis le port 8080 de l'hôte.Choisir un port hôte différent est généralement préférable car cela évite d'interférer avec d'autres services potentiellement importants fonctionnant sur votre machine. Assurez-vous simplement de choisir un port hôte qui n'est pas non plus déjà utilisé et qui est supérieur à 1024 si vous n'exécutez pas Docker en tant que root/administrateur (les ports inférieurs à 1024 sont souvent privilégiés).