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 lsdocker 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.ymldocker-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 &lt;container id&gt;docker container stop &lt;container id&gt; 不起作用 然后我尝试了docker rm -f &lt;container id&gt;,它成功了。 现在我尝试了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粘贴到&lt;container-name&gt;位置。【参考方案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 失败:端口已分配的主要内容,如果未能解决你的问题,请参考以下文章

docker keepalived VIP怎么绑定

Docker:使用 --volume 绑定挂载的文件权限

Docker 错误绑定:地址已在使用中

让 docker 使用 IPv4 进行端口绑定

docker compose 卷类型 - 绑定与卷

docker-compose:为绑定挂载和托管挂载定义挂载