Docker - Bind для 0.0.0.0:4000 не удалось: порт уже выделен

Я впервые использую Docker и пытаюсь реализовать это - https://docs.docker.com/get-started/part2/#tag-the-image

На одном этапе я пытался соединиться с localhost с помощью этой команды -

$ curl http://localhost:4000

который показал это error-

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.

Кажется, порт выделен, так что вы можете помочь мне, сообщив, как я могу решить эту проблему.. Большое спасибо :)

Ответ 1

Вы должны убедиться, что предыдущий контейнер, который вы запустили, был убит, прежде чем запускать новый, который использует тот же порт.

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

Ответ 2

Отдавая должное IgorBeaz, вам нужно прекратить работу с текущим контейнером. Для этого вы узнаете текущий CONTAINER ID:

$ 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

Ответ 3

Выше два ответа верны, но у меня не получилось.

  1. Я продолжал видеть пустой, как показано ниже для docker container lsenter image description here
  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, и этот процесс не присутствовал.

Ответ 4

Я решил это так:

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

docker-compose down

Затем я выполнил команду lsof чтобы найти процесс с использованием порта (для меня это был порт 9000)

sudo lsof -i -P -n | grep 9000

Наконец, я "убил" процесс (в моем случае это было расширение VSCode):

kill -9 <process id>

Ответ 5

Для тех, кто имеет эту проблему с docker-compose. Когда у вас есть более одного проекта (т.е. в разных папках) с похожими сервисами, вам нужно запустить docker-compose stop в каждом из ваших других проектов.

Ответ 6

Остановка контейнера для меня тоже не сработала. Я изменил порт в docker-compose.yml.

Ответ 7

У меня была такая же проблема с docker-compose:

  1. Убитый докер-прокси процесс.
  2. Перезапустите докер
  3. Запустите docker-compose снова.

Ответ 8

docker ps откроет список контейнеров, работающих в докере.
Найдите тот, который работает на нужном порту, запишите его PID

и остановите и удалите этот контейнер, используя следующие команды
docker stop PID
docker rm PID
Теперь запустите docker-compose, ваши сервисы должны работать так, как вы сейчас освободили нужный порт.