Docker - 绑定到 0.0.0.0:4000 失败:端口已被占用。

284

我是第一次使用Docker,我正在尝试实现这个操作 - https://docs.docker.com/get-started/part2/#tag-the-image

在某个阶段,我尝试使用以下命令连接本地主机 -

$ 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.
27个回答

447

在启动使用同一端口的新容器之前,您需要确保之前启动的容器已被终止。

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

6
您可以将来自docker container ls命令的容器 ID粘贴到<container-name>的位置。 - Kamal Hossain
5
我在运行 docker container ls 命令时得到了一个空列表,但端口仍然被占用。 - Gulzar
6
专业提示:docker psdocker container ls 的作用相同。 - testing_22
我重新启动了Docker服务service docker restart,但端口仍然被阻塞。我使用pkilled命令终止了所有占用该端口的进程,但它仍然被阻塞。对我来说,删除容器是解决办法。 - Markus Zeller
docker container ls -a,可能更好 - undefined

102
致敬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
容器 ID 的前三个字符足以停止容器,因此停止容器更简单,只需运行以下命令: $ docker stop 12a - ndemarco

89

我尝试了以上所有答案,但都没有成功,在我的情况下,即使docker container ls也没有显示任何正在运行的容器。看起来问题是因为docker代理仍在使用端口,尽管没有容器在运行。在我的情况下,我正在使用Ubuntu。以下是我尝试并解决问题的方法,只需运行以下两个命令:

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

4
请记住,删除 local-kv.db 同时也会删除所有用户定义的网络。 - Niklas Gschaider
14
在我的系统上,这个问题通过 systemctl restart docker 命令得到了解决。我不需要运行其他任何命令。 - asynts
如何在Mac上完成? - Oleg Abrazhaev
6
如果您拥有Docker Desktop,则只需从那里重新启动。 - Justinas
1
请帮我理解 docker network prune 命令,谢谢! - ImLeo
4
在Mac上的Docker桌面版中,我点击了“故障排除菜单”(bug图标),然后点击了“重新启动Docker桌面版”。 - ksav

41

我的解决方法如下:

首先,我停止了所有正在运行的容器:

docker-compose down

然后我执行了lsof命令来查找正在使用该端口的进程(对我来说,是9000端口)

sudo lsof -i -P -n | grep 9000

最后,我“杀死”了进程(在我的情况下,这是一个VSCode扩展程序):

kill -9 <process id>

4
按照yamenk所接受的答案的建议,没有发现正在使用的容器。这个答案帮助我通过端口追踪进程。如果这个答案中还包含检查活动docker容器的信息,那么它应该是被接受的答案。 "端口已分配"并不总是意味着 "docker容器已经在运行"。 - TPHughes

37

快速修复问题的方法是重新启动 docker

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

这对我有用!我找不到容器的位置,所以无法移除它。 - JC Lopez
这对我也起作用了。我怪Docker for Windows... - Michael Manley
对我来说也是一样的,我甚至尝试停止所有容器,但没有起到任何帮助作用...(在Debian Bookworm Proxmox虚拟机上) - undefined
这对我也起作用了。lsof 没有找到使用该端口的任何进程。 - undefined

20

上面两个答案是正确的,但对我不起作用。

  1. 当我运行docker container ls时,我一直看到如下所示的空白页面enter 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,发现该进程不再存在。

3
即使从归档(-a)选项中删除所有 Docker,我仍然收到此错误消息:错误启动用户空间代理:绑定到0.0.0.0:8080失败:端口已被占用。 - BrB
也许是其他进程占用了这个端口。找出来,如果不必要就结束该进程,你的端口就会被释放。 - paul

13

使用nginx docker镜像时,我也遇到了这个错误:

docker: Error response from daemon: driver failed programming external connectivity on endpoint recursing_knuth (9186f7d7f523732b99d3510029cde9679f3f3fe7b7eb5f612d54c4aacea58220): Bind for 0.0.0.0:8080 failed: port is already allocated.

我使用以下命令解决了它:

$ docker container ls
$ docker stop [CONTAINER ID]

然后,再次运行这个 Docker 容器(像这样)就可以了:

$ docker run -v $PWD/vueDemo:/usr/share/nginx/html -p 8080:80 -d nginx:alpine

您只需停止之前的Docker容器。


12

我曾经遇到过与docker-compose相关的同样问题,解决方法如下:

  1. 杀掉 docker-proxy 进程
  2. 重启 Docker
  3. 再次启动 docker-compose

12

在 Linux 上,执行 'sudo systemctl restart docker' 命令解决了我的问题。


8
如果您正在使用Docker-Desktop,您可以退出Docker-Desktop,然后重新启动它。这对我解决了问题。

我也遇到了同样的问题,即Bind for 0.0.0.0:80 failed: port is already allocated,但是像你说的那样,重新启动Windows 10上的Docker Desktop就解决了我的问题。 - Bullsized

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接