Привязка ошибки Docker: адрес уже используется

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
Запустите, sudo netstat -pna | grep 3000чтобы получить прослушивающий процесс.
BMitch
2
Ваш вывод показывает, что какой-то другой процесс уже прослушивает порт 3000. Вы можете использовать какой-нибудь другой порт? Попробуйте с помощью, sudoчтобы увидеть имя процесса.
techtabu
Да, на этом порту был ntop. Спасибо! Я не знал, sudoможно ли изменить вывод :)
Ngoral
Для меня это порт 8888, который является прокси-сервером докеров
Нил МакГиган
Я исправил ту же проблему в этом ответе: stackoverflow.com/a/58772307/3530707
jmojico

Ответы:

92

В вашем случае это был какой-то другой процесс, который использовал порт и, как указано в комментариях, 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 08
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
Аюшья
60

Мне это помогло:

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)эта линия была всем, что мне было нужно. Спасибо
Райан Уокер
Исоф сработал заклинанием, прервал процесс и вернулся в действие ....
г-н Э
11

У меня была
docker-compose down --rmi allтакая же проблема (в том же каталоге, где вы запускаете docker-compose up),
помогает

Литволес
источник
3
Да, это всегда помогает, но downобычно это последнее, что вы хотите сделать. Потеря текущего состояния - это не кусок сахара.
Ngoral
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

В моем случае это было

Ошибка при запуске прокси-сервера пользователя: прослушивание tcp 0.0.0.0:9000: привязка: адрес уже используется

И все, что мне нужно, это отключить прослушивание отладки в php storm икона

user3724832
источник
4

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

Обратите внимание на следующий контрольный список:

1) Проверьте текущую среду создания докеров
Run docker-compose ps.
Если порт используется другим контейнером, остановите его docker-compose stop <service-name-in-compose-file>или удалите, заменив stopна rm.

2) Проверьте контейнеры, работающие за пределами вашей текущей рабочей области.
Выполните, 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) Restart Docker служба
Run: sudo service docker restart.

5) Вы достигли этой точки и ..
Только если это не подвергает вашу систему опасности - подумайте о перезапуске сервера.

RtmY
источник
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"
Дмитрий Сандалов
источник
0

Я сталкивался с одной и той же проблемой несколько раз. Перезапуск докера, похоже, помогает

Арвинд
источник
я вижу, как перезапустить контейнер. Как перезапустить докер?
Марк Уорделл,
0

Я решил проблему, перезапустив Docker.

Майк Лин
источник
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'

Работает отлично. (Единственная проблема заключается в том, что изменение будет стерто, если я когда-либо обновлю проект, поскольку оно поступает из внешнего репо.)

SwingingFromTheTrees
источник
0

Просто примечание, если у вас такая же проблема и с Windows:

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

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

Надеюсь, это поможет.

WesternGun
источник
0

Тот, который использовал порт 8888, был Jupiter, и мне пришлось изменить файл конфигурации ноутбука Jupiter для работы на другом порту.

чтобы перечислить, кто использует этот конкретный порт. sudo lsof -i -P -n | grep 9

Вы можете указать порт, который должен запускать Jupyter, раскомментировав / отредактировав следующую строку в ~ / .jupyter / jupyter_notebook_config.py:

c.NotebookApp.port = 9999

Если у вас нет jupyter_notebook_config.py, попробуйте запустить jupyter notebook --generate-config. См. Здесь для получения дополнительных сведений о конфигурации Jupyter.

Оскар Ранжел
источник
0

Смена network_mode: "мост" на "хост" сделала это за меня.

Это с

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
источник
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 / Oracle

у меня все сработало!

Махеш Керагуте
источник
0

На моей машине PID не отображался этой командой netstat -tulpnдля используемого порта (8080), поэтому я не мог его убить, уничтожение контейнеров и перезагрузка компьютера не работали. Итак, service docker restartкоманда перезапустила докер для меня (ubuntu), и порт больше не использовался, и я счастливый парень и пошел на обед.

Джереми
источник
0

Когда я пытался запустить новый conatier-listen 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

Затем попробуйте перезапустить контейнер, он должен работать

Крипа Мишра
источник
-1
`$` sudo service redis-server stop

Делает трюк.

Мленге Фануэль
источник