Docker Error bind: adres już w użyciu

94

Po uruchomieniu docker-compose upw moim projekcie Docker kończy się niepowodzeniem z następującym komunikatem:

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

netstat -pna | grep 3000 pokazuje to:

tcp        0      0 0.0.0.0:3000            0.0.0.0:*               LISTEN      -  

Już próbowałem docker-compose down, ale to nie pomaga.

Ngoral
źródło
7
Uruchom, sudo netstat -pna | grep 3000aby uzyskać proces, który nasłuchuje.
BMitch
2
Wynik pokazuje, że inny proces już nasłuchuje na porcie 3000. Czy możesz użyć innego portu? Spróbuj, sudoaby zobaczyć nazwę procesu.
techtabu
Tak, na tym porcie był ntop. Dzięki! Nie wiedziałem, że sudomożna zmienić wyjście :)
Ngoral
Dla mnie jest to port 8888, który jest proxy docker
Neil McGuigan,
Naprawiłem ten sam problem w tej odpowiedzi: stackoverflow.com/a/58772307/3530707
jmojico

Odpowiedzi:

93

W twoim przypadku był to inny proces, który korzystał z portu i jak wskazano w komentarzach, sudo netstat -pna | grep 3000pomógł ci w rozwiązaniu problemu.

Podczas gdy w innych przypadkach (sam się z tym spotkałem wielokrotnie), jest to przeważnie ten sam kontener działający w innym przypadku. W tym przypadku docker psbyło to bardzo pomocne, ponieważ często zostawiałem te same kontenery działające w innych katalogach, a następnie próbowałem uruchomić ponownie w innych miejscach, w których były używane te same nazwy kontenerów.

Jak docker psmi pomogło: docker rm -f $(docker ps -aq) to krótkie polecenie, którego używam do usuwania wszystkich kontenerów.

Edycja: dodano, jak docker psmi pomogło.

Ayushya
źródło
3
Właściwie często mam ten problem. I nic, ale docker-compose downpomaga
Ngoral
To z pewnością pomoże, pod warunkiem, że uruchamiasz go w tym samym katalogu, w którym został uruchomiony docker-compose up. Natomiast w mojej odpowiedzi radzę znaleźć już uruchomiony kontener i podjąć pożądane działania. Uznałem za stosowne, aby je usunąć, jeśli ktoś nie chce usunąć, zamiast tego rmużywa się go, stopaby je zatrzymać.
Ayushya
1
Mam inny serwer działający na tym samym porcie, na którym tensorflow/tensorflowbędą działać obrazy. Jak mogę skonfigurować mój obraz, aby działał na innym porcie. Próbowałem tego: docker run -it -d -p 8888:8000 tensorflow/tensorflow powiązałem port 8888 z mojego obrazu z 8000 na kliencie, ale nie działa.
Emanuel Fontelles
1
@EmanuelFontelles Podczas próby debugowania nie używaj -dopcji. Teraz porty są widoczne jako HOST:CONTAINER. Dlatego powinieneś biecdocker run -it -p 8000:8888
Ayushya
60

Pomogło mi to:

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

a następnie: kill -9 <process id>(macOS) lub sudo kill <process id>(Linux).

Źródło: komentarz użytkownika Rub21 .

Tomasz Bartkowiak
źródło
3
docker rm -fv $(docker ps -aq)ta linia była wszystkim, czego potrzebowałem. Dzięki
Ryan Walker
lsof zadziałał czarująco, zabił proces i wrócił do akcji ...
Pan E
11

Miałem ten sam problem
docker-compose down --rmi all(w tym samym katalogu, w którym uruchamiasz docker-compose)
pomaga

Lytvoles
źródło
3
Tak, to zawsze pomaga, ale downjest to ostatnia rzecz, którą zwykle chcesz zrobić. Utrata obecnego stanu to nie cukier.
Ngoral
3
Spowoduje to również usunięcie pobranych lokalnych obrazów dockera, więc używaj ich ostrożnie
Micah Simmons
Powinieneś był wspomnieć, że spowoduje to usunięcie lokalnych obrazów dockera w odpowiedzi.
Ahmed Nour Jamal El-Din
8

W systemie Linux / Unix:

Proste wyszukiwanie narzędzia linux za pomocą następującego polecenia

netstat -nlp | grep 8888

Pokaże przetwarzanie działające na tym porcie, a następnie zabije ten proces za pomocą PID (poszukaj PID w wierszu) tego procesu.

kill PID
Neeraj Bansal
źródło
netstat pokazuje PID / program (np. 2714 / splunkd) .sudo kill 2714 działa. Dzięki.
Roy
5

Miałem ten sam problem. Naprawiłem to, zatrzymując usługę Apache2 na moim hoście.

Fabien Thetis
źródło
to też był mój problem, zapomniałem zainstalować Apache
Mustapha-Belkacim
4

W moim przypadku tak było

Błąd podczas uruchamiania serwera proxy przestrzeni użytkownika: nasłuchiwanie tcp 0.0.0.0:9000: bind: adres jest już używany

I wszystko, czego potrzebuję, to wyłączyć nasłuchiwanie debugowania w burzy php Ikona

user3724832
źródło
4

W niektórych przypadkach krytyczne jest przeprowadzenie dokładniejszego debugowania problemu przed zatrzymaniem kontenera lub zabiciem procesu.

Rozważ skorzystanie z poniższej listy kontrolnej:

1) Sprawdź bieżące środowisko Docker Compose
Run docker-compose ps.
Jeśli port jest używany przez inny pojemnik, zatrzymaj go docker-compose stop <service-name-in-compose-file>lub usuń, zastępując stopgo rm.

2) Sprawdź kontenery działające poza bieżącym obszarem roboczym
Uruchom, docker psaby zobaczyć listę wszystkich kontenerów uruchomionych na Twoim hoście.
Jeśli okaże się, że port jest używany przez inny kontener, możesz go zatrzymać za pomocą docker stop <container-id>.
(*) Ponieważ nie jesteś objęty zakresem composeśrodowiska źródłowego - dobrą praktyką jest najpierw użycie docker inspect, aby zebrać więcej informacji o kontenerze, który zamierzasz zatrzymać.

3) Sprawdź, czy port jest używany przez inne procesy działające na hoście
Na przykład, jeśli port to 6379, uruchom:

$ 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

(*) Możesz także użyć polecenia lsof, które służy głównie do pobierania informacji o plikach otwieranych przez różne procesy (sugeruję uruchomienie netstatwcześniej).

Tak więc w przypadku wyjścia powyżej PIDis 915. Teraz możesz biegać:

$ 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

Zobacz też identyfikator procesu nadrzędnego ( PPID) i polecenie wykonania.
Możesz także uruchomić: $ pstree -s <PID>do wizualnej prezentacji procesu i związanych z nim procesów.

W naszym przypadku widzimy, że proces prawdopodobnie jest demonem (PPID to 1) - w takim przypadku rozważ uruchomienie:
A) $ cat /proc/<PID>/statusw celu uzyskania bardziej szczegółowych informacji o procesie, takich jak liczba wątków utworzonych przez proces, jego możliwości itp. ”.
B) $ systemctl status <PID>, aby zobaczyć plikjednostkę, która spowodowała powstanie określonego procesu. Jeśli usługa nie jest krytyczna - możesz ją zatrzymać i wyłączyć .

4) Restart Docker serwis
Run: sudo service docker restart.

5) Osiągnąłeś ten punkt i ...
Tylko jeśli nie stwarza to zagrożenia dla Twojego systemu - rozważ ponowne uruchomienie serwera.

RtmY
źródło
2

Zaktualizowałem mojego dockera dziś po południu i napotkałem ten sam problem. Próbowałem ponownie uruchomić dockera, ale bez powodzenia.

W końcu musiałem ponownie uruchomić komputer i zadziałało. Zdecydowanie błąd.

Charles Zhao
źródło
Ponowne uruchomienie też mi pomogło. Dzięki.
Alexander
1

Sprawdź docker-compose.yml, może się zdarzyć, że port został określony dwukrotnie.

version: '3'
services:
  registry:
    image: mysql:5.7
        ports:
      - "3306:3306"             <--- remove either this line or next
      - "127.0.0.1:3306:3306"
DmitrySandalov
źródło
0

Kilka razy napotkałem ten sam problem. Wydaje się, że ponowne uruchomienie dockera załatwia sprawę

arvind
źródło
Widzę, jak zrestartować kontener. Jak zrestartować docker?
Mark Wardell
0

Rozwiązuję ten problem, ponownie uruchamiając Docker.

Mike Lin
źródło
0
docker-compose down --rmi all 

a następnie uruchom ponownie komputer

Yusuf Kayikci
źródło
7
Odpowiadając na pytanie sprzed trzech lat z ośmioma innymi odpowiedziami, warto wskazać, jakiego nowego aspektu pytania dotyczy twoja odpowiedź.
Jason Aller
0

Odmiana odpowiedzi @ DmitrySandalov: miałem tomcat / java działający na 8080, który musiał działać. Przejrzałem plik docker-compose.yml i zmieniłem wpis dla 8080 na inny, który wybrałem.

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

Działał doskonale. (Jedyną pomyłką jest to, że zmiana zostanie usunięta, jeśli kiedykolwiek zaktualizuję projekt, ponieważ pochodzi z zewnętrznego repozytorium).

SwingingFromTheTrees
źródło
0

Na marginesie, jeśli masz ten sam problem i dotyczy systemu Windows:

W moim przypadku proces na mojej drodze jest sprawiedliwy grafana-server.exe. Ponieważ najpierw pobrałem wersję binarną i dwukrotnie kliknąłem plik wykonywalny, a teraz uruchamia się jako usługa użytkownika, SYSTEMktórej nie mogę taskkill(brak pozwolenia)

Muszę przejść do „Menedżera usług” systemu Windows i wyszukać usługę „Grafana” i ją zatrzymać. Po tym porcie 3000 nie jest już zajęte.

Mam nadzieję, że to pomoże.

WesternGun
źródło
0

Tym, który korzystał z portu 8888 był Jupiter i musiałem zmienić plik konfiguracyjny notebooka Jupiter, aby działał na innym porcie.

aby wyświetlić listę osób używających tego konkretnego portu. sudo lsof -i -P -n | grep 9

Możesz określić port, na którym Jupyter ma uruchamiać usuwanie komentarzy / edytowanie następującego wiersza w ~ / .jupyter / jupyter_notebook_config.py:

c.NotebookApp.port = 9999

Jeśli nie masz pliku jupyter_notebook_config.py, spróbuj uruchomić notatnik jupyter --generate-config. Zobacz to, aby uzyskać więcej informacji na temat konfiguracji Jupyter.

Oscar Rangel
źródło
0

Zmiana network_mode: „bridge” na „host” zrobiła to za mnie.

To z

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
źródło
0

Przed uruchomieniem na: docker run -d --name oracle -p 1521: 1521 -p 5500: 5500 qa / oracle Właśnie zmieniłem port na docker run -d --name oracle -p 1522: 1522 -p 5500: 5500 qa / wyrocznia

działało dobrze dla mnie!

Mahesh Keragute
źródło
0

Na moim komputerze PID nie był wyświetlany z tego polecenia netstat -tulpndla używanego portu (8080), więc nie mogłem go zabić, zabijanie kontenerów i ponowne uruchamianie komputera nie działały. Więc service docker restartpolecenie zrestartowało docker dla mnie (ubuntu), a port nie był już używany i jestem szczęśliwym facetem i jadę na lunch.

Jeremy
źródło
0

Otrzymałem poniższy błąd, gdy próbowałem uruchomić nowy conatier - słuchaj tcp 0.0.0.0:8080: bind: address już w użyciu.

Rozwiązanie: netstat -tulnp | grep 8080

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

zabić -9 12749

Następnie spróbuj ponownie uruchomić kontener, który powinien działać

Kripa Mishra
źródło
-1
`$` sudo service redis-server stop

Zrób sztuczkę.

Mlenge Fanuel
źródło