Docker-Fehlerbindung: Adresse wird bereits verwendet

94

Wenn ich docker-compose upin meinem Docker-Projekt ausgeführt werde, schlägt die folgende Meldung fehl:

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

netstat -pna | grep 3000 zeigt dies:

tcp        0      0 0.0.0.0:3000            0.0.0.0:*               LISTEN      -  

Ich habe es bereits versucht docker-compose down, aber es hilft nicht.

Ngoral
quelle
7
Führen Sie a aus sudo netstat -pna | grep 3000, um den Prozess abzurufen, der zuhört.
BMitch
2
Ihre Ausgabe zeigt, dass ein anderer Prozess bereits Port 3000 überwacht. Können Sie einen anderen Port verwenden? Versuchen Sie es mit sudo, um den Prozessnamen zu sehen.
Techtabu
Ja, es gab kein Top an diesem Port. Danke! Ich wusste nicht, sudokann die Ausgabe ändern :)
Ngoral
Für mich ist es Port 8888, der Docker-Proxy ist
Neil McGuigan
Ich habe das gleiche Problem in dieser Antwort behoben
jmojico

Antworten:

93

In Ihrem Fall war es ein anderer Prozess, der den Port verwendete und sudo netstat -pna | grep 3000Ihnen, wie in den Kommentaren angegeben, bei der Lösung des Problems half.

In anderen Fällen (ich selbst bin oft darauf gestoßen) handelt es sich meistens um denselben Container, der in einer anderen Instanz ausgeführt wird. In diesem Fall docker pswar es sehr hilfreich, da ich oft dieselben Container in anderen Verzeichnissen laufen ließ und dann erneut versuchte, sie an anderen Stellen auszuführen, an denen dieselben Containernamen verwendet wurden.

Wie docker psmir geholfen hat: docker rm -f $(docker ps -aq) ist ein kurzer Befehl, mit dem ich alle Container entferne.

Edit: Hinzugefügt, wie docker psmir geholfen hat.

Ayushya
quelle
3
Eigentlich habe ich dieses Problem oft. Und nichts, aber docker-compose downhilft
Ngoral
Dies ist sicher hilfreich, sofern Sie es in demselben Verzeichnis ausführen, in dem Sie es ausgeführt haben docker-compose up. Während ich in meiner Antwort empfehle, den Container zu finden, der bereits läuft, und die gewünschten Maßnahmen zu ergreifen. Ich fand es angemessen, sie zu entfernen. Wenn jemand sie nicht entfernen möchte, wird sie stattdessen rmverwendet stop, um sie zu stoppen.
Ayushya
1
Ich habe einen anderen Server, der auf demselben Port ausgeführt wird, auf dem das tensorflow/tensorflowImage ausgeführt wird. Wie kann ich mein Image so einrichten, dass es an einem anderen Port ausgeführt wird? Ich habe docker run -it -d -p 8888:8000 tensorflow/tensorflow Folgendes versucht: Ich habe Port 8888 von meinem Image auf dem Client an 8000 gebunden, aber es funktioniert nicht.
Emanuel Fontelles
1
@EmanuelFontelles Verwenden Sie beim Debuggen keine -dOption. Jetzt werden Ports als angezeigt HOST:CONTAINER. So sollten Sie laufendocker run -it -p 8000:8888
Ayushya
62

Das hat mir geholfen:

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

und dann: kill -9 <process id>(macOS) oder sudo kill <process id>(Linux).

Quelle: Kommentar des Benutzers Rub21 .

Tomasz Bartkowiak
quelle
3
docker rm -fv $(docker ps -aq)Diese Linie war alles was ich brauchte. Vielen Dank
Ryan Walker
lsof hat einen Zauber gewirkt, den Prozess beendet und ist wieder in Aktion ...
Mr. E
11

Ich hatte das gleiche Problem
docker-compose down --rmi all(in dem gleichen Verzeichnis, in dem Sie Docker-Compose ausführen)
hilft

Lytvoles
quelle
3
Ja, es hilft immer, aber es downist das Letzte, was Sie normalerweise tun möchten. Den gegenwärtigen Zustand zu verlieren ist kein Stück Zucker.
Ngoral
3
Dadurch werden auch die lokalen Docker-Bilder gelöscht, die Sie gezogen haben. Verwenden Sie sie daher mit Vorsicht
Micah Simmons,
Sie sollten erwähnt haben, dass die lokalen Docker-Bilder in der Antwort gelöscht werden.
Ahmed Nour Jamal El-Din
8

Für Linux / Unix:

Einfache Suche nach dem Linux-Dienstprogramm mit dem folgenden Befehl

netstat -nlp | grep 8888

Die an diesem Port ausgeführte Verarbeitung wird angezeigt. Anschließend wird der Prozess mithilfe der PID (suchen Sie nach einer PID in der Reihe) dieses Prozesses abgebrochen.

kill PID
Neeraj Bansal
quelle
netstat zeigt die PID / das Programm (zB 2714 / splunkd) .sudo kill 2714 funktioniert. Vielen Dank.
Roy
5

Ich hatte das gleiche Problem. Ich habe dies behoben, indem ich den Apache2-Dienst auf meinem Host gestoppt habe.

Fabien Thetis
quelle
Dies war auch mein Problem. Ich habe vergessen, dass ich Apache
Mustapha-Belkacim
4

In meinem Fall war es

Fehler beim Starten des Userland-Proxys: Listen tcp 0.0.0.0:9000: bind: Adresse wird bereits verwendet

Und alles, was ich brauche, ist das Debug-Hören im PHP-Sturm auszuschalten Symbol

user3724832
quelle
4

In einigen Fällen ist es wichtig, ein eingehenderes Debuggen des Problems durchzuführen, bevor ein Container gestoppt oder ein Prozess beendet wird.

Befolgen Sie die folgende Checkliste:

1) Überprüfen Sie die aktuellen Docker compose Umgebung
ausführen docker-compose ps.
Wenn der Port von einem anderen Container verwendet wird, stoppen Sie ihn mit docker-compose stop <service-name-in-compose-file>oder entfernen Sie ihn durch Ersetzen stopdurch rm.

2) Überprüfen Sie die Container, die außerhalb Ihres aktuellen Arbeitsbereichs ausgeführt werden.
Führen docker psSie die Liste aller Container aus, die unter Ihrem Host ausgeführt werden.
Wenn Sie feststellen, dass der Port von einem anderen Container verwendet wird, können Sie ihn mit stoppen docker stop <container-id>.
(*) Da Sie sich nicht im Bereich der Ursprungsumgebung befinden, composeempfiehlt es sich, zuerst Docker Inspect zu verwenden, um weitere Informationen zu dem Container zu sammeln, den Sie stoppen möchten.

3) Überprüfen Sie, ob der Port von anderen auf dem Host ausgeführten Prozessen verwendet wird.
Beispiel: Wenn der Port 6379 ausgeführt wird:

$ 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

(*) Sie können auch den Befehl lsof verwenden, der hauptsächlich zum Abrufen von Informationen zu Dateien verwendet wird, die von verschiedenen Prozessen geöffnet werden (ich empfehle, netstatvorher ausgeführt zu werden).

Also, im Falle der Ausgabe über dem PIDist 915. Jetzt können Sie ausführen:

$ 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

Und sehen Sie sich die ID des übergeordneten Prozesses ( PPID) und den Ausführungsbefehl an.
Sie können auch Folgendes ausführen: $ pstree -s <PID>zu einer visuellen Anzeige des Prozesses und der zugehörigen Prozesse.

In unserem Fall können wir sehen, dass der Prozess wahrscheinlich ein Daemon ist (PPID ist 1). In diesem Fall sollten Sie Folgendes ausführen :
A) $ cat /proc/<PID>/status, um detailliertere Informationen über den Prozess zu erhalten, z. B. die Anzahl der vom Prozess erzeugten Threads. seine Fähigkeiten usw. '.
B) $ systemctl status <PID>um die zu sehenEinheit, die die Erstellung eines bestimmten Prozesses verursacht hat. Wenn der Dienst nicht kritisch ist, können Sie den Dienst beenden und deaktivieren .

4) Starten Sie Docker Service
Run: sudo service docker restart.

5) Sie haben diesen Punkt erreicht und ..
Nur wenn Ihr System dadurch nicht gefährdet wird, sollten Sie den Server neu starten.

RtmY
quelle
2

Ich habe heute Nachmittag meinen Docker aktualisiert und bin auf dasselbe Problem gestoßen. Ich habe versucht, Docker neu zu starten, aber kein Glück.

Schließlich musste ich meinen Computer neu starten und es funktionierte. Auf jeden Fall ein Fehler.

Charles Zhao
quelle
Ein Neustart hat mir auch geholfen. Vielen Dank.
Alexander
1

Überprüfen docker-compose.ymlSie, ob der Port möglicherweise zweimal angegeben wird.

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

Ich bin mehrmals auf dasselbe Problem gestoßen. Docker neu zu starten scheint den Trick zu tun

arvind
quelle
Ich sehe, wie man einen Container neu startet. Wie starte ich Docker neu?
Mark Wardell
0

Ich behebe das Problem durch einen Neustart von Docker.

Mike Lin
quelle
0
docker-compose down --rmi all 

und starten Sie dann Ihren Computer neu

Yusuf Kayikci
quelle
7
Wenn Sie eine drei Jahre alte Frage mit acht weiteren Antworten beantworten, ist es hilfreich, darauf hinzuweisen, welchen neuen Aspekt der Frage Ihre Antwort anspricht.
Jason Aller
0

Eine Variation von @ DmitrySandalovs Antwort: Ich hatte Tomcat / Java auf 8080 laufen lassen, was weitergehen musste. Ich habe mir die Datei docker-compose.yml angesehen und den Eintrag für 8080 in einen anderen meiner Wahl geändert.

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

Hat perfekt funktioniert. (Die einzige Falte ist, dass die Änderung gelöscht wird, wenn ich das Projekt jemals aktualisiere, da es von einem externen Repo stammt.)

SwingingFromTheTrees
quelle
0

Nur eine Randnotiz, wenn Sie das gleiche Problem haben und mit Windows arbeiten:

In meinem Fall ist der Prozess in meinem Weg gerecht grafana-server.exe. Weil ich zuerst die Binärversion heruntergeladen und auf die ausführbare Datei doppelklickt habe und sie jetzt als Dienst des Benutzers startet, SYSTEMden ich nicht kanntaskkill (keine Berechtigung)

Ich muss zum "Service Manager" von Windows gehen und nach dem Service "Grafana" suchen und ihn beenden. Danach ist Port 3000 nicht mehr besetzt.

Hoffentlich hilft das.

WesternGun
quelle
0

Derjenige, der den Port 8888 verwendete, war Jupiter, und ich musste die Konfigurationsdatei des Jupiter-Notebooks ändern, um auf einem anderen Port ausgeführt zu werden.

um aufzulisten, wer diesen bestimmten Port verwendet. sudo lsof -i -P -n | grep 9

Sie können den Port angeben, den Jupyter ausführen soll, indem Sie die folgende Zeile in ~ / .jupyter / jupyter_notebook_config.py auskommentieren / bearbeiten:

c.NotebookApp.port = 9999

Falls Sie keine jupyter_notebook_config.py haben, versuchen Sie, jupyter notebook --generate-config auszuführen. Weitere Informationen zur Jupyter-Konfiguration finden Sie hier.

Oscar Rangel
quelle
0

Das Ändern von network_mode: "bridge" in "host" hat es für mich getan.

Dies mit

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"
laut
quelle
0

Bevor es lief auf: Docker run -d --name oracle -p 1521: 1521 -p 5500: 5500 qa / oracle Ich habe gerade den Port in Docker run -d --name oracle -p 1522: 1522 -p 5500 geändert: 5500 qa / Orakel

es hat gut funktioniert für mich!

Mahesh Keragute
quelle
0

Auf meinem Computer wurde von diesem Befehl keine PID netstat -tulpnfür den verwendeten Port (8080) angezeigt , sodass ich ihn nicht beenden konnte. Das Beenden der Container und der Neustart des Computers funktionierten nicht. Also hat service docker restartCommand Docker für mich neu gestartet (Ubuntu) und der Port wurde nicht mehr benutzt und ich bin ein glücklicher Kerl und mache mich auf den Weg zum Mittagessen.

Jeremy
quelle
0

Ich habe den folgenden Fehler erhalten, als ich versucht habe, einen neuen Conatier-Listen-TCP 0.0.0.0:8080 zu starten: bind: Adresse wird bereits verwendet.

Lösung: netstat -tulnp | grep 8080

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

töte -9 12749

Versuchen Sie dann, den Container neu zu starten, der funktionieren soll

Kripa Mishra
quelle
-1
`$` sudo service redis-server stop

Macht den Trick.

Mlenge Fanuel
quelle