Docker Error bind: адреса вже використовується


94

Коли я запускаю docker-compose upсвій проект Docker, він отримує таке повідомлення:

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

netstat -pna | grep 3000 показує це:

tcp        0      0 0.0.0.0:3000            0.0.0.0:*               LISTEN      -  

Я вже пробував docker-compose down, але це не допомагає.


7
Запустіть a, sudo netstat -pna | grep 3000щоб отримати процес, який прослуховується.
BMitch

2
Ваш результат показує, що якийсь інший процес вже прослуховує порт 3000. Чи можете ви використовувати інший порт? Спробуйте sudoпобачити назву процесу.
techtabu

Так, на цьому порту був ntop. Спасибі! Я не знав, sudoможе змінити результат :)
Нгораль

Для мене це порт 8888, який є проксі-сервером докера
Ніл Макгіган,

Я встановив це ж питання в цій відповіді: stackoverflow.com/a/58772307/3530707
jmojico

Відповіді:


93

У вашому випадку це був якийсь інший процес, який використовував порт і, як зазначено в коментарях, sudo netstat -pna | grep 3000допоміг вам у вирішенні проблеми.

У той час як в інших випадках (я сам з цим стикався багато разів) це в основному той самий контейнер, який працює в якомусь іншому екземплярі. У цьому випадку це docker psбуло дуже корисно, оскільки часто я залишав ті самі контейнери, що працюють в інших каталогах, а потім намагався запустити знову в інших місцях, де використовувались ті самі імена контейнерів.

Як docker psмені допомогло: docker rm -f $(docker ps -aq) це коротка команда, яку я використовую для видалення всіх контейнерів.

Редагувати: Додано, як docker psмені допомогло.


3
Насправді, ця проблема у мене часто виникає. І нічого, але docker-compose downдопомагає
Нгорал

Це обов’язково допоможе, за умови, що ви запускаєте його в тому ж каталозі, де ви працювали docker-compose up. Хоча я рекомендую у своїй відповіді знайти контейнер, який уже запущений, і вжити бажаних дій. Я вважав за доцільне видалити їх, якщо хтось не хоче видаляти, то замість цього використовується rmвикористання, stopщоб зупинити їх.
Ayushya

1
У мене є ще один сервер, що працює на тому самому порту, що і tensorflow/tensorflowзображення. Як я можу налаштувати своє зображення на інший порт? Я спробував це: docker run -it -d -p 8888:8000 tensorflow/tensorflow я прив’язав порт 8888 зі свого зображення до 8000 на клієнті, але не працюю.
Емануель

1
@EmanuelFontelles При спробі налагодження не використовуйте -dопцію. Тепер порти виставляються як HOST:CONTAINER. Таким чином, вам слід бігтиdocker run -it -p 8000:8888
Аюша

62

Це мені допомогло:

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

а потім: kill -9 <process id>(macOS) або sudo kill <process id>(Linux).

Джерело: коментар користувача Rub21 .


3
docker rm -fv $(docker ps -aq)цей рядок був усім, що мені потрібно. Дякую
Райан Уокер,

lsof спрацював шарм, вбив процес і знову в дії ....
Містер Е

11

У мене була така ж проблема,
docker-compose down --rmi all(в тій же директорії , де виконується докер-компонувати вгору)
допомагає


3
Так, це завжди допомагає, але downце останнє, що ти зазвичай хочеш зробити. Втрата поточного стану - це не шматочок цукру.
Нгорал,

3
Це також призведе до видалення зображень локального докера, які ви витягли, тому використовуйте його з обережністю
Міка Сіммонс,

Ви повинні були згадати, що у відповіді видалять локальні зображення докера.
Ахмед Нур Джамаль Ель-Дін

8

Для Linux / Unix:

Простий пошук утиліти Linux за допомогою наступної команди

netstat -nlp | grep 8888

Він покаже обробку, що виконується на цьому порту, а потім вбиває цей процес за допомогою PID (шукайте PID у рядку) цього процесу.

kill PID

netstat показує PID / програму (наприклад, 2714 / splunkd) .sudo kill 2714 працює. Дякую.
Рой

5

У мене була та сама проблема. Я виправив це, зупинивши службу Apache2 на моєму хості.


це теж була моя проблема, я забув, що встановив Apache
Mustapha-Belkacim

4

У моєму випадку це було

Помилка запуску проксі-сервера userland: слухати tcp 0.0.0.0:9000: bind: адреса вже використовується

І все, що мені потрібно, це вимкнути налагодження прослуховування в php storm значок


4

У деяких випадках критично важливо провести більш глибоку налагодження проблеми перед тим, як зупинити контейнер або вбити процес.

Розгляньте наступний контрольний список нижче:

1) Перевірте поточне середовище складання докера
Виконати docker-compose ps.
Якщо порт використовується іншим контейнером, зупиніть його docker-compose stop <service-name-in-compose-file>або видаліть, замінивши stopна rm.

2) Перевірте контейнери , що працюють за межами вашого поточного робочого простору
Run , docker psщоб побачити список усіх контейнерів , що працюють під управлінням хоста.
Якщо ви виявите, що порт використовується іншим контейнером, ви можете зупинити його за допомогою docker stop <container-id>.
(*) Оскільки ви не потрапляєте в сферу дії composeсередовища походження - спочатку вдалою практикою є використання docker inspect щоб зібрати більше інформації про контейнер, який ви збираєтесь зупинити.

3) Перевірте, чи порт використовується іншими процесами, що виконуються на хості.
Наприклад, якщо порт запущений 6379:

$ 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

(*) Ви також можете використовувати команду lsof, яка в основному використовується для отримання інформації про файли, які відкриваються різними процесами (я пропоную запустити netstatдо цього).

Отже, у випадку виходу вище PIDє 915. Тепер ви можете запустити:

$ 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

І подивіться ідентифікатор батьківського процесу ( PPID) та команду виконання.
Ви також можете запустити: $ pstree -s <PID>для візуального відображення процесу та пов’язаних із ним процесів.

У нашому випадку ми можемо бачити, що процес, ймовірно, є демоном (PPID дорівнює 1) - У такому випадку слід запустити:
A) $ cat /proc/<PID>/status, щоб отримати більш поглиблену інформацію про процес, наприклад, кількість потоків, породжених процесом, його можливості тощо '.
Б)$ systemctl status <PID> для того, щоб побачитиодиниця, яка спричинила створення конкретного процесу. Якщо послуга не є критичною - її можна зупинити та вимкнути .

4) Перезапустіть службу Docker
Run:sudo service docker restart .

5) Ви досягли цієї точки і ..
Тільки якщо це не загрожує вашій системі - спробуйте перезапустити сервер.


2

Сьогодні вдень я оновив свій докер і зіткнувся з тією ж проблемою. Я спробував перезапустити докер, але не пощастило.

Нарешті, довелося перезавантажити комп’ютер, і він запрацював. Безумовно, помилка.


Перезапуск допоміг і мені. Дякую.
Олександр

1

Перевірте docker-compose.yml, може бути так, що порт вказано двічі.

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

1

Я отримував помилку нижче, коли намагався запустити новий conatier - слухати tcp 0.0.0.0:8080: bind: адреса вже використовується.

Рішення: 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:* СЛУХАЄ 12749 / Java [root@ip-112-x6x-2x-xxx.xxxxx.compute.internal (aws_main) ~] #

вбити -9 12749

Потім спробуйте перезапустити контейнер, який повинен працювати


Пляма на ! ваше рішення допомогло.
Альферд Нобель

0

Я кілька разів стикався з одним і тим же питанням. Здається, перезапуск докера робить трюк


я бачу, як перезапустити контейнер. Як перезапустити докер?
Марк Уорделл,


0
docker-compose down --rmi all 

а потім перезавантажте комп'ютер


7
Відповідаючи на трирічне запитання за допомогою восьми інших відповідей, корисно вказати, на який новий аспект запитання звертається ваша відповідь.
Джейсон Аллер,

0

Варіація відповіді @ DmitrySandalov: у мене був запущений tomcat / java на 8080, який потрібно було продовжувати. Переглянув файл docker-compose.yml і змінив запис для 8080 на інший, обраний мною.

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

Працював ідеально. (Єдина зморшка - зміна буде знищена, якщо я коли-небудь оновлю проект, оскільки це надходить із зовнішнього репо.)


0

Просто підказка, якщо у вас така сама проблема, і це стосується Windows:

У моєму випадку процес на моєму шляху справедливий grafana-server.exe. Оскільки я спочатку завантажив двійкову версію та двічі клацнув виконуваний файл, і тепер він запускається як послуга користувача, SYSTEMчого я не можу taskkill(без дозволу)

Мені потрібно зайти в «Менеджер служб» Windows і знайти службу «Графана», і зупинити її. Після цього порт 3000 більше не зайнятий.

Сподіваюся, що це допомагає.


0

Той, хто використовував порт 8888, був Юпітер, і мені довелося змінити файл конфігурації ноутбука Юпітер, щоб він працював на іншому порту.

щоб перелічити, хто використовує цей конкретний порт. sudo lsof -i -P -n | grep 9

У ~ / .jupyter / jupyter_notebook_config.py ви можете вказати порт, який потрібно, щоб Jupyter запускав, коментуючи / редагуючи наступний рядок:

c.NotebookApp.port = 9999

Якщо у вас немає jupyter_notebook_config.py, спробуйте запустити jupyter notebook --generate-config. Докладніше про конфігурацію Jupyter див. У цьому.


0

Зміна network_mode: "bridge" на "host" зробив це за мене.

Це с

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

До того, як він запускався: docker run -d --name oracle -p 1521: 1521 -p 5500: 5500 qa / oracle, я просто змінив порт на docker run -d --name oracle -p 1522: 1522 -p 5500: 5500 qa / оракул

у мене це добре працювало!


0

На моїй машині PID не відображався з цієї команди netstat -tulpnдля використовуваного порту (8080), тому я не міг його вбити, вбиваючи контейнери та перезавантажуючи комп'ютер, не працювало. Отже, service docker restartкоманда перезапустила докер для мене (ubuntu), і порт вже не використовувався, і я щасливий хлопець і обідаю.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.