Docker-绑定0.0.0.0:4000失败:端口已分配


80

我是第一次使用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.

Answers:


136

在启动使用相同端口的新容器之前,您需要确保已杀死先前启动的容器。

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

40

向IgorBeaz致敬,您需要停止运行当前容器。为此,您将要知道当前的容器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

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)选项中删除了所有泊坞窗后,我仍然收到此错误启动用户级代理时出错:为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
遵循yamenk接受的答案的建议,表明没有使用容器。这个答案帮助我使用端口跟踪了该过程。如果此答案还包含用于检查活动docker的信息,则它应为已接受的答案。“端口已分配”并不总是意味着“
docker

5

我在docker-compose上遇到了同样的问题:

  1. 杀死了docker-proxy processe。
  2. 重新启动docker
  3. 再次启动docker-compose。

4

对于任何有这个问题的人docker-compose。当您有一个以上的项目(即位于不同的文件夹中)且具有相似的服务时,您需要docker-compose stop 其他每个项目中运行。


4

我尝试了以上所有答案,但都没有用,就我而言,甚至docker container ls没有显示任何容器正在运行。看起来问题似乎是由于即使没有容器在运行,Docker代理仍在使用端口。就我而言,我正在使用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


0

docker-compose.yml和中指定的相同端口可能存在冲突docker-compose.override.yml或明确指定相同的端口和使用环境变量。

我在docker-compose.yml使用环境变量指定的容器上有一个with端口,并docker-compose.override.yml有一个明确指定的相同端口之一。显然,docker试图在同一个容器上打开这两个容器。docker container ls -a由于容器无法启动并列出端口,因此没有列出。


0

快速修复是只需重启docker

  1. sudo service docker stop
  2. sudo service docker start
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.