Ответ 1
Вы должны убедиться, что предыдущий контейнер, который вы запустили, был убит, прежде чем запускать новый, который использует тот же порт.
docker container ls
docker rm -f <container-name>
Я впервые использую 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.
Кажется, порт выделен, так что вы можете помочь мне, сообщив, как я могу решить эту проблему.. Большое спасибо :)
Вы должны убедиться, что предыдущий контейнер, который вы запустили, был убит, прежде чем запускать новый, который использует тот же порт.
docker container ls
docker rm -f <container-name>
Отдавая должное 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
Выше два ответа верны, но у меня не получилось.
docker container ls
docker container ls -a
, и после этого он показал все ранее завершенные и запущенные процессы.docker stop <container id>
или docker container stop <container id>
не работалиdocker rm -f <container id>
, и это сработало.docker container ls -a
, и этот процесс не присутствовал.Я решил это так:
Сначала я остановил все запущенные контейнеры:
docker-compose down
Затем я выполнил команду lsof
чтобы найти процесс с использованием порта (для меня это был порт 9000)
sudo lsof -i -P -n | grep 9000
Наконец, я "убил" процесс (в моем случае это было расширение VSCode):
kill -9 <process id>
Для тех, кто имеет эту проблему с docker-compose
. Когда у вас есть более одного проекта (т.е. в разных папках) с похожими сервисами, вам нужно запустить docker-compose stop
в каждом из ваших других проектов.
Остановка контейнера для меня тоже не сработала. Я изменил порт в docker-compose.yml
.
У меня была такая же проблема с docker-compose:
docker ps
откроет список контейнеров, работающих в докере.
Найдите тот, который работает на нужном порту, запишите его PID
и остановите и удалите этот контейнер, используя следующие команды docker stop PID
docker rm PID
Теперь запустите docker-compose, ваши сервисы должны работать так, как вы сейчас освободили нужный порт.