【问题标题】:Docker - Bind for 0.0.0.0:4000 failed: port is already allocatedDocker - 绑定 0.0.0.0:4000 失败:端口已分配
【发布时间】: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.

【问题讨论】:

    标签: docker port


    【解决方案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),所以我解决它的方法很简单:

            1. 删除网络(我知道在一个容器使用这个网络之前有问题的端口(9010)docker network lsdocker network rm blabla (or id)
            2. 我实际上使用的是新网络,而不是旧的(有故障的)网络,但应该不需要
            3. 重启 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

                  1. sudo service docker stop
                  2. 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 时遇到了同样的问题:

                    1. 已终止 docker-proxy 进程。
                    2. 重启泊坞窗
                    3. 再次启动 docker-compose。

                    【讨论】:

                      【解决方案13】:

                      对于任何遇到docker-compose 问题的人。 当您有多个项目(即在不同文件夹中)具有类似服务时,您需要在每个其他项目中运行docker-compose stop

                      【讨论】:

                        【解决方案14】:

                        停止容器对我也不起作用。我更改了docker-compose.yml中的端口。

                        【讨论】:

                          【解决方案15】:

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

                          1. 我一直看到如下空白 docker container ls
                          2. 然后我尝试了docker container ls -a,然后它显示了之前退出并运行的所有进程。
                          3. 然后docker stop &lt;container id&gt;docker container stop &lt;container id&gt; 不起作用
                          4. 然后我尝试了docker rm -f &lt;container id&gt;,它成功了。
                          5. 现在我尝试了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
                          猜你喜欢
                          • 2018-07-19
                          • 2022-11-19
                          • 1970-01-01
                          • 2022-11-12
                          • 2017-05-22
                          • 1970-01-01
                          • 2012-07-25
                          • 1970-01-01
                          • 2022-06-22
                          相关资源
                          最近更新 更多