Docker - 绑定 0.0.0.0:4000 失败:端口已分配
Posted
技术标签:
【中文标题】Docker - 绑定 0.0.0.0:4000 失败:端口已分配【英文标题】:Docker - Bind for 0.0.0.0:4000 failed: port is already allocated 【发布时间】:2018-02-20 22:16:26 【问题描述】:我是第一次使用 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.
【问题讨论】:
【参考方案1】:如果您使用的是 Docker-Desktop,您可以退出 Docker Desktop,然后重新启动它。它为我解决了这个问题。
【讨论】:
【参考方案2】:不要忘记最简单的解决方法......
重新启动计算机。
我已经尝试了上述大部分方法,但仍然无法修复它。然后只需restart my Mac
,然后一切恢复正常。
【讨论】:
【参考方案3】:当我使用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 容器即可。
【讨论】:
【参考方案4】:在 Linux 上,您可以运行 sudo netstat -tulpn
以查看当前在该端口上侦听的内容。然后,您可以选择将该进程或 Docker 容器配置为绑定到不同的端口以避免冲突。
【讨论】:
【参考方案5】:对我来说,没有显示正在运行的容器,所以没有使用端口 9010(在我的情况下)但 Docker 仍然抱怨。
我不想重置我的 Docker(适用于 Windows),所以我解决它的方法很简单:
-
删除网络(我知道在一个容器使用这个网络之前有问题的端口(9010)
docker network ls
docker network rm blabla (or id)
我实际上使用的是新网络,而不是旧的(有故障的)网络,但应该不需要
重启 Docker
这是唯一对我有用的方法。我无法解释,但不知何故,“旧”网络仍然绑定到该端口(9010),Docker 继续“阻止”它(苦恼)
【讨论】:
【参考方案6】:我尝试了上述所有答案,但都没有奏效,就我而言,即使docker container ls
也没有显示任何容器正在运行。看起来问题是由于 docker 代理仍在使用端口,尽管没有容器运行。就我而言,我使用的是 ubuntu。这是我尝试并解决问题的方法,只需运行以下两个命令:
sudo service docker stop
sudo rm -f /var/lib/docker/network/files/local-kv.db
【讨论】:
请记住,删除 local-kv.db 也会删除所有用户定义的网络。【参考方案7】:就我而言,没有要杀死的进程。
更新 docker 解决了这个问题。
【讨论】:
【参考方案8】:docker ps
将显示在 docker 上运行的容器列表。找到在您需要的端口上运行的那个并记下它的 PID。
使用以下命令停止并删除该容器:
docker stop PID
docker rm PID
现在运行docker-compose up
,您的服务应该会在您释放所需端口时运行。
【讨论】:
【参考方案9】:快速解决方法是重启docker:
sudo service docker stop
sudo service docker start
【讨论】:
【参考方案10】:这可能与docker-compose.yml
和docker-compose.override.yml
中指定的相同端口或使用环境变量显式指定的相同端口冲突。
我有一个docker-compose.yml
,其端口使用环境变量指定在容器上,而docker-compose.override.yml
则明确指定了相同的端口之一。显然 docker 试图在同一个容器上打开两者。 docker container ls -a
未列出,因为容器无法启动并列出端口。
【讨论】:
我也发生了同样的事情,但有点相反——docker-compose.yml
明确指定了端口,docker-compose.override.yml
有不同的明确设置,加上一个 env var 告诉应用程序使用该新端口.通过注释掉docker-compose.yml
文件中的ports
来修复,因为我们只在本地使用docker-compose(即:使用覆盖文件)。在 docker-compose.override.yml
中为应用程序定义的 env var 从未使用过,因为该应用程序从未启动 - 在我们看来,这只是两个撰写文件中的 ports
设置不匹配。【参考方案11】:
我是这样解决的:
首先,我停止了所有正在运行的容器:
docker-compose down
然后我执行lsof
命令来查找使用端口的进程(对我来说是端口9000)
sudo lsof -i -P -n | grep 9000
最后,我“杀死”了这个进程(在我的例子中,它是一个 VSCode 扩展):
kill -9 <process id>
【讨论】:
按照 yamenk 接受的答案的建议,显示没有容器在使用。这个答案帮助我跟踪使用端口的过程。如果此答案还包含用于检查活动 docker 包含的信息,那么它应该是公认的答案。 “端口已分配”并不总是意味着“docker 容器已在运行”【参考方案12】:我在使用 docker-compose 时遇到了同样的问题:
-
已终止 docker-proxy 进程。
重启泊坞窗
再次启动 docker-compose。
【讨论】:
【参考方案13】:对于任何遇到docker-compose
问题的人。
当您有多个项目(即在不同文件夹中)具有类似服务时,您需要在每个其他项目中运行docker-compose stop
。
【讨论】:
【参考方案14】:停止容器对我也不起作用。我更改了docker-compose.yml
中的端口。
【讨论】:
【参考方案15】:以上两个答案是正确的,但对我不起作用。
-
我一直看到如下空白
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
,但这个进程不存在。
【讨论】:
即使在从存档 (-a) 选项中删除所有 docker 之后,我仍然收到此错误 Error started userland proxy: Bind for 0.0.0.0:8080 failed: port is already assigned. 可能有别的东西占用了这个端口。找出并在没有必要的情况下终止该进程,您的端口将是空闲的。【参考方案16】:在启动使用相同端口的新容器之前,您需要确保之前启动的容器已被终止。
docker container ls
docker rm -f <container-name>
【讨论】:
您可以将docker container ls
命令中的CONTAINER ID粘贴到<container-name>
位置。【参考方案17】:
向 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
【讨论】:
容器ID的前三个字符足以停止容器,所以停止容器更简单如$ docker stop 12a
以上是关于Docker - 绑定 0.0.0.0:4000 失败:端口已分配的主要内容,如果未能解决你的问题,请参考以下文章