Erreur Docker bind: adresse déjà utilisée


94

Lorsque je l'exécute docker-compose updans mon projet Docker, il échoue avec le message suivant:

Error starting userland proxy: listen tcp 0.0.0.0:3000: bind: address already in use

netstat -pna | grep 3000 montre ceci:

tcp        0      0 0.0.0.0:3000            0.0.0.0:*               LISTEN      -  

J'ai déjà essayé docker-compose down, mais ça n'aide pas.


7
Exécutez a sudo netstat -pna | grep 3000pour obtenir le processus qui écoute.
BMitch

2
Votre sortie montre qu'un autre processus écoute déjà sur le port 3000. Pouvez-vous utiliser un autre port? Essayez avec sudopour voir le nom du processus.
techtabu

Oui, il y avait ntop sur ce port. Merci! Je ne savais pas que je pouvais sudochanger la sortie :)
Ngoral

Pour moi, c'est le port 8888 qui est un proxy docker
Neil McGuigan

J'ai résolu ce même problème dans cette réponse: stackoverflow.com/a/58772307/3530707
jmojico

Réponses:


93

Dans votre cas, c'était un autre processus qui utilisait le port et, comme indiqué dans les commentaires, sudo netstat -pna | grep 3000vous a aidé à résoudre le problème.

Alors que dans d'autres cas (je l'ai moi-même rencontré plusieurs fois), il s'agit principalement du même conteneur fonctionnant sur une autre instance. Dans ce cas, docker psc'était très utile car je laissais souvent les mêmes conteneurs s'exécuter dans d'autres répertoires, puis j'essayais de recommencer à d'autres endroits, où les mêmes noms de conteneurs étaient utilisés.

Comment docker psm'a aidé: docker rm -f $(docker ps -aq) est une commande courte que j'utilise pour supprimer tous les conteneurs.

Edit: Ajouté comment docker psm'a aidé.


3
En fait, j'ai souvent ce problème. Et rien, mais docker-compose downaide
Ngoral

Cela ne manquera pas de vous aider, à condition que vous l'exécutiez dans le même répertoire que celui où vous l'avez exécuté docker-compose up. Bien que je recommande dans ma réponse de trouver le conteneur qui est déjà en cours d'exécution et de prendre les mesures souhaitées. Je me suis senti approprié de les supprimer, si quelqu'un ne veut pas les supprimer, il faut plutôt utiliser rmuse stoppour les arrêter.
Ayushya

1
J'ai un autre serveur fonctionnant sur le même port que celui de l' tensorflow/tensorflowimage. Comment puis-je configurer mon image pour qu'elle s'exécute dans un autre port. J'ai essayé ceci: docker run -it -d -p 8888:8000 tensorflow/tensorflow j'ai lié le port 8888 de mon image à 8000 sur le client, mais ne fonctionne pas.
Emanuel Fontelles

1
@EmanuelFontelles Lorsque vous essayez de déboguer, n'utilisez pas d' -doption. Désormais, les ports sont exposés en tant que HOST:CONTAINER. Ainsi, vous devriez courirdocker run -it -p 8000:8888
Ayushya

62

Cela m'a aidé:

docker-compose down  # Stop container on current dir if there is a docker-compose.yml
docker rm -fv $(docker ps -aq)  # Remove all containers
sudo lsof -i -P -n | grep <port number>  # List who's using the port

puis: kill -9 <process id>(macOS) ou sudo kill <process id>(Linux).

Source: commentaire de l'utilisateur Rub21 .


3
docker rm -fv $(docker ps -aq)cette ligne était tout ce dont j'avais besoin. Merci
Ryan Walker

lsof a travaillé un charme, tué le processus et de retour en action ....
M. E

11

J'ai eu le même problème,
docker-compose down --rmi all(dans le même répertoire où vous exécutez docker-compose up)
aide


3
Oui, cela aide toujours, mais downc'est la dernière chose que vous voulez généralement faire. Perdre l'état actuel n'est pas un morceau de sucre.
Ngoral

3
Cela supprimera également les images de docker locales que vous avez tirées, alors utilisez-les avec prudence
Micah Simmons

Vous devriez avoir mentionné que cela supprimera les images du docker local dans la réponse.
Ahmed Nour Jamal El-Din

8

Pour Linux / Unix:

Recherche simple de l'utilitaire Linux à l'aide de la commande suivante

netstat -nlp | grep 8888

Il affichera le traitement en cours sur ce port, puis tuera ce processus en utilisant le PID (recherchez un PID dans la ligne) de ce processus.

kill PID

netstat montre le PID / programme (par exemple 2714 / splunkd) .sudo kill 2714 fonctionne. Merci.
Roy

5

J'ai eu le même problème. J'ai résolu ce problème en arrêtant le service Apache2 sur mon hôte.


c'était aussi mon problème, j'ai oublié que j'avais installé Apache
Mustapha-Belkacim le

4

Dans mon cas, c'était

Erreur lors du démarrage du proxy userland: listen tcp 0.0.0.0:9000: bind: adresse déjà utilisée

Et tout ce dont j'ai besoin est de désactiver l'écoute de débogage dans php storm icône


4

Dans certains cas, il est essentiel d'effectuer un débogage plus approfondi du problème avant d'arrêter un conteneur ou de tuer un processus.

Pensez à suivre la liste de contrôle ci-dessous:

1) Vérifiez votre environnement de composition de docker actuel
Exécutez docker-compose ps.
Si le port est utilisé par un autre conteneur, arrêtez-le docker-compose stop <service-name-in-compose-file>ou retirez-le en le remplaçant stoppar rm.

2) Vérifiez les conteneurs s'exécutant en dehors de votre espace de travail actuel
Exécutez docker pspour voir la liste de tous les conteneurs s'exécutant sous votre hôte.
Si vous trouvez que le port est utilisé par un autre conteneur, vous pouvez l'arrêter avec docker stop <container-id>.
(*) Parce que vous n'êtes pas dans le cadre de l' composeenvironnement d' origine , il est préférable d' utiliser d'abord docker inspect pour collecter plus d'informations sur le conteneur que vous êtes sur le point d'arrêter.

3) Vérifiez si le port est utilisé par d'autres processus exécutés sur l'hôte
Par exemple, si le port est 6379 run:

$ sudo netstat -ltnp | grep ':6379'
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      915/redis-server 12 
tcp6       0      0 ::1:6379                :::*                    LISTEN      915/redis-server 12

(*) Vous pouvez également utiliser la commande lsof qui est principalement utilisée pour récupérer des informations sur les fichiers ouverts par divers processus (je suggère de courir netstatavant cela).

Donc, dans le cas de la sortie ci-dessus, le PIDest 915. Vous pouvez maintenant exécuter:

$ ps j 915
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
    1   915   915   915 ?           -1 Ssl    123   0:11 /usr/bin/redis-server 127.0.0.1:6379

Et voyez l'ID du processus parent ( PPID) et la commande d'exécution.
Vous pouvez également exécuter: $ pstree -s <PID>vers un affichage visuel du processus et de ses processus associés.

Dans notre cas, nous pouvons voir que le processus est probablement un démon (PPID vaut 1) - Dans ce cas, envisagez d'exécuter:
A) $ cat /proc/<PID>/statusafin d'obtenir des informations plus détaillées sur le processus comme le nombre de threads générés par le processus, ses capacités, etc. ».
B) $ systemctl status <PID>pour voir leunité qui a provoqué la création d'un processus spécifique. Si le service n'est pas critique, vous pouvez arrêter et désactiver le service .

4) Redémarrez le service Docker
Run: sudo service docker restart.

5) Vous avez atteint ce point et ..
Uniquement si cela ne met pas votre système en danger - envisagez de redémarrer le serveur.


2

J'ai mis à niveau mon docker cet après-midi et j'ai rencontré le même problème. J'ai essayé de redémarrer docker mais pas de chance.

Enfin, j'ai dû redémarrer mon ordinateur et cela a fonctionné. Certainement un bug.


Le redémarrage m'a aidé aussi. Merci.
Alexander

1

Vérifiez docker-compose.yml, il se peut que le port soit spécifié deux fois.

version: '3'
services:
  registry:
    image: mysql:5.7
        ports:
      - "3306:3306"             <--- remove either this line or next
      - "127.0.0.1:3306:3306"

0

J'ai rencontré le même problème plusieurs fois. Le redémarrage de docker semble faire l'affaire


je vois comment redémarrer un conteneur. Comment redémarrer docker?
Mark Wardell


0
docker-compose down --rmi all 

puis redémarrez votre ordinateur


7
Lorsque vous répondez à une question vieille de trois ans avec huit autres réponses, il est utile d'indiquer à quel nouvel aspect de la question votre réponse traite.
Jason Aller

0

Une variante de la réponse de @ DmitrySandalov: j'avais tomcat / java fonctionnant sur 8080, ce qui devait continuer. J'ai regardé le fichier docker-compose.yml et modifié l'entrée pour 8080 en une autre de mon choix.

nginx:
  build: nginx
  ports:
    #- '8080:80' <-- original entry
    - '8880:80'
    - '8443:443'

A parfaitement fonctionné. (Le seul problème est que le changement sera effacé si jamais je mets à jour le projet, car il provient d'un dépôt externe.)


0

Juste une remarque si vous rencontrez le même problème et que vous utilisez Windows:

Dans mon cas, le processus à ma manière est juste grafana-server.exe. Parce que j'ai d'abord téléchargé la version binaire et double-cliquez sur l'exécutable, et il démarre maintenant en tant que service par utilisateur SYSTEMque je ne peux pas taskkill(pas d'autorisation)

Je dois aller dans le "Gestionnaire de service" de Windows et rechercher le service "Grafana" et l'arrêter. Après cela, le port 3000 n'est plus occupé.

J'espère que ça t'as aidé.


0

Celui qui utilisait le port 8888 était Jupiter et j'ai dû changer le fichier de configuration du notebook Jupiter pour qu'il s'exécute sur un autre port.

pour lister qui utilise ce port spécifique. sudo lsof -i -P -n | grep 9

Vous pouvez spécifier le port sur lequel Jupyter doit exécuter en décommentant / modifiant la ligne suivante dans ~ / .jupyter / jupyter_notebook_config.py:

c.NotebookApp.port = 9999

Si vous n'avez pas de jupyter_notebook_config.py, essayez d'exécuter jupyter notebook --generate-config. Voir ceci pour plus de détails sur la configuration de Jupyter.


0

Changer network_mode: "bridge" en "host" l'a fait pour moi.

Ceci avec

version: '2.2'
services:
  bind:
    image: sameersbn/bind:latest
    dns: 127.0.0.1
    ports:
      - 172.17.42.1:53:53/udp
      - 172.17.42.1:10000:10000
    volumes:
        - "/srv/docker/bind:/data"
    environment:
      - 'ROOT_PASSWORD=secret'
    network_mode: "host"

0

Avant qu'il ne s'exécute sur: docker run -d --name oracle -p 1521: 1521 -p 5500: 5500 qa / oracle Je viens de changer le port en docker run -d --name oracle -p 1522: 1522 -p 5500: 5500 qa / oracle

cela a bien fonctionné pour moi!


0

Sur ma machine, un PID n'était pas affiché à partir de cette commande netstat -tulpnpour le port en cours d'utilisation (8080), donc je ne pouvais pas le tuer, tuer les conteneurs et redémarrer l'ordinateur ne fonctionnait pas. Donc, la service docker restartcommande a redémarré le docker pour moi (ubuntu) et le port n'était plus utilisé et je suis un gars heureux et je suis parti déjeuner.


0

J'obtenais l'erreur ci-dessous lorsque j'essayais de lancer un nouveau conatier- listen tcp 0.0.0.0:8080: bind: adresse déjà utilisée.

Solution: netstat -tulnp | grep 8080

[root@ip-112-x6x-2x-xxx.xxxxx.compute.internal (aws_main) ~] # netstat -tulnp | grep 8080 tcp 0 0 0.0.0.0:8080 0.0.0.0:* ECOUTER 12749 / java [root@ip-112-x6x-2x-xxx.xxxxx.compute.internal (aws_main) ~] #

tuer -9 12749

Ensuite, essayez de relancer le conteneur cela devrait fonctionner


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.