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.

Ngoral
la source
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é.

Ayushya
la source
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 .

Tomasz Bartkowiak
la source
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

Lytvoles
la source
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
Neeraj Bansal
la source
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.

Fabien Thétis
la source
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

user3724832
la source
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.

RtmY
la source
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.

Charles Zhao
la source
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"
DmitrySandalov
la source
0

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

Arvind
la source
je vois comment redémarrer un conteneur. Comment redémarrer docker?
Mark Wardell
0

Je résous le problème en redémarrant Docker.

Mike Lin
la source
0
docker-compose down --rmi all 

puis redémarrez votre ordinateur

Yusuf Kayikci
la source
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.)

BalançantDeLesArbres
la source
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é.

WesternGun
la source
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.

Oscar Rangel
la source
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"
noud
la source
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!

Mahesh Keragute
la source
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.

Jérémie
la source
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

[[email protected] (aws_main) ~] # netstat -tulnp | grep 8080 tcp 0 0 0.0.0.0:8080 0.0.0.0:* ECOUTER 12749 / java [[email protected] (aws_main) ~] #

tuer -9 12749

Ensuite, essayez de relancer le conteneur cela devrait fonctionner

Kripa Mishra
la source
-1
`$` sudo service redis-server stop

Fait l'affaire.

Mlenge Fanuel
la source