Docker - Помилка прив’язки для 0.0.0.0:4000: порт уже виділено


81

Я використовую docker вперше, і я намагався реалізувати це - https://docs.docker.com/get-started/part2/#tag-the-image

На одному етапі я намагався підключитися до localhost за допомогою цієї команди -

$ curl http://localhost:4000

яка показала цю помилку -

curl: (7) Failed to connect to localhost port 4000: Connection refused

Однак я вирішив це за допомогою наступного коду -

$ docker-machine ip default
$ curl http://192.168.99.100:4000

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

$ docker run -p 4000:80 anibar/get-started:part1

Але, я отримав цю помилку

C:\Program Files\Docker Toolbox\docker.exe: Error response from daemon: driver failed programming external connectivity on endpoint goofy_bohr (63f5691ef18ad6d6389ef52c56198389c7a627e5fa4a79133d6bbf13953a7c98): Bind for 0.0.0.0:4000 failed: port is already allocated.

Відповіді:


139

Вам потрібно переконатися, що попередній запущений вами контейнер убитий, перш ніж запускати новий, який використовує той самий порт.

docker container ls
docker rm -f <container-name>

40

Віддаючи належне IgorBeaz, вам потрібно припинити запуск поточного контейнера. Для цього ви будете знати поточний ідентифікатор контейнера:

$ docker container ls

Ви отримуєте щось на зразок:

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES
12a32e8928ef        friendlyhello       "python app.py"     51 seconds ago      Up 50 seconds       0.0.0.0:4000->80/tcp   romantic_tesla   

Потім ви зупиняєте контейнер:

$ docker stop 12a32e8928ef

Нарешті ви намагаєтесь зробити те, що хотіли зробити, наприклад:

$ docker run -p 4000:80 friendlyhello

12

Вище дві відповіді правильні, але не працювали для мене.

  1. Я продовжував бачити порожнє, як показано нижче docker container lsвведіть тут опис зображення
  2. Потім я спробував, docker container ls -aі після цього він показав весь процес, який раніше був запущений і запущений.
  3. Тоді docker stop <container id>чи docker container stop <container id>не працювало
  4. тоді я спробував, docker rm -f <container id>і це спрацювало.
  5. Зараз на цьому я спробував, docker container ls -aі цього процесу не було.

2
Навіть після видалення всіх докерів з опції архіву (-a), я все одно отримую цю помилку Помилка запуску проксі-сервера userland: Помилка прив’язки для 0.0.0.0:8080: порт вже виділений.
BrB

Можливо, щось інше займає цей порт. Дізнайтеся і, якщо не потрібно, переривайте процес, і ваш порт буде вільним.
Пол,

12

Я вирішив це таким чином:

Спочатку я зупинив усі запущені контейнери:

docker-compose down

Потім я виконав lsofкоманду, щоб знайти процес за допомогою порту (для мене це був порт 9000)

sudo lsof -i -P -n | grep 9000

Нарешті, я "вбив" процес (у моєму випадку це було розширення VSCode):

kill -9 <process id>

1
Наслідуючи пораду прийнятої відповіді Яменка, контейнери не використовуються. Ця відповідь допомогла мені відстежити процес за допомогою порту. Якщо ця відповідь містила інформацію для перевірки активного докера, а також вона повинна бути прийнятою відповіддю. "порт вже виділено" не завжди означає "контейнер
докера

5

У мене була така ж проблема з docker-compose:

  1. Вбитий докер-проксі-процес.
  2. Перезапустіть докер
  3. Почніть docker-compose знову.

4

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


4

Я спробував усі вищезазначені відповіді, жодна з них не працювала, у моєму випадку навіть docker container lsне відображається жоден запущений контейнер. схоже, проблема пов’язана з тим, що проксі-провайдер все ще використовує порти, навіть якщо контейнери не запущені. У моєму випадку я використовував ubuntu. Ось що я спробував і вирішив проблему, просто виконайте наступні дві команди:

sudo service docker stop
sudo rm -f /var/lib/docker/network/files/local-kv.db

3

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

Зупиніть і видаліть цей контейнер, використовуючи такі команди:

docker stop PID
docker rm PID

Тепер запустіть, docker-compose upі ваші служби повинні працювати, коли ви звільнили необхідний порт.


2

Зупинка контейнера для мене теж не спрацювала. Я змінив порт в docker-compose.yml.


1

Це може бути конфлікт з тим же портом , зазначеним в docker-compose.ymlі docker-compose.override.ymlабо ж порт вказаний явно і з допомогою змінної оточення.

У мене був docker-compose.ymlпорт з портами в контейнері, вказаному із використанням змінних середовища, та docker-compose.override.ymlодин із тими самими портами, явно вказаними. Мабуть, докер намагався відкрити обидва на одному контейнері. docker container ls -aні в списку, ні тому, що контейнер не міг запустити і перерахувати порти.


0

Швидке виправлення - це просто перезапуск докера :

  1. sudo service docker stop
  2. sudo service docker start

0

У моєму випадку не було процесу вбивства.

Оновлення докера вирішило проблему.

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