【问题标题】:docker: driver failed programming external connectivity on endpoint webserverdocker:驱动程序在端点网络服务器上编程外部连接失败
【发布时间】:2016-09-15 09:49:27
【问题描述】:

我正在尝试运行一个 docker 示例 following this documentation

这是我的命令:

docker run -d -p 80:80 --name webserver nginx

但我收到此错误:

docker:来自守护程序的错误响应:驱动程序在端点网络服务器上编程外部连接失败(bd57efb73c738e3b271db180ffbee0a56cae86c8193242fbc02ea805101df21e):启动用户级代理时出错:绑定 0.0.0.0:80:意外错误(EADDRINUSE 失败)。

我该如何解决这个问题?

【问题讨论】:

    标签: docker


    【解决方案1】:

    从您的错误消息中,EADDRINUSE 表示端口 80 已在 docker VM 上或可能直接在您的笔记本电脑上使用。您可以停止该端口上正在运行的任何内容,或者更改 Docker 命令中使用的端口。要更改为外部端口 8080,请使用:

    docker run -d -p 8080:80 --name webserver nginx
    

    【讨论】:

    • 在我的情况下,它没有明确提到有问题的端口,但由于我暴露了一系列端口(-p 1000-2000:1000-2000)我怀疑这会是原因
    • 重启 docker 服务 - 是最快的一步,所以应该先测试
    • @IlyaKolesnikov 是的,就像锤子是安装干墙螺钉的最快方法一样。我仍然想检查正在使用该端口的内容,如果停止 docker 修复了它,那么它就是一个侦听该端口的容器,停止一个容器可以解决它而不会杀死其他所有东西。使用docker ps 查看哪些容器正在运行/监听端口。
    • @shabby 的范围,您不在该范围内的任何端口上侦听,您在该范围内的 每个 端口上侦听,至少从 docker 设置转发器主机到容器。
    【解决方案2】:

    如果你是我没有使用的端口,请尝试重新启动 docker。这通常对我有用。

    【讨论】:

    • 这是最好的起点,尤其是当你有理由确定它没有被使用时。
    • 有时重启电脑也有帮助。
    • 在您的情况下,docker system prune --volumes 也可能在不重新启动服务的情况下有所帮助。 ——!!!当心!!!:它会删除很多东西,所以首先用docker ps -adocker images -a检查你的容器,以确保你不会丢失一些重要的东西(也就是不可恢复的)。此修剪将从驻留在 VM 上的有限大小磁盘中释放空间(使用适用于 WindowsmacOS 的 Docker Desktop)。这通常是 Docker Desktop 开始出现高度不可预测行为的原因。
    • 您可以通过运行以下命令获取 docker 上运行的端口的进程 ID - sudo lsof -i tcp: 然后,一旦您有了进程 ID,您就可以使用 - kill - 杀死它9 现在你的端口上运行的进程将被关闭,你可以再次启动 docker,它会正常工作。
    • 呃,这终于解决了我的问题,不知道你可以通过这样的 UI 重新启动
    【解决方案3】:

    尝试重新启动 docker 服务。它在 99% 的时间内都有效。

    service docker restart
    

    如果没有按预期工作,请尝试重新启动您的电脑,然后使用上述命令重新启动 docker 服务。

    如果上述方法都不起作用,请尝试将暴露的端口更改为另一个应该可以工作的未使用端口。

    docker run -d -p 81:80 --name webserver nginx
    

    注意:- 81 是您主机上的端口,80 是您的 docker 容器上的端口

    【讨论】:

    • 最后一件事成功了。我将 docker-compose 文件中的端口从3306:3306 更改为3307:3307,然后错误ERROR: for MYDOCKERCOMPOSESERVICE Cannot start service MYDOCKERCOMPOSESERVICE: driver failed programming external connectivity on endpoint MYDOCKERCOMPOSESERVICE 消失了。
    • 但这并不能解决您的业务用例。通过在您的方法中使用,您实际上并没有将您的应用程序暴露给外部单词。尝试使用 3307:3306,因为您在 docker 内的服务在 3306 中运行。您可以从主机通过 3307 访问它。
    • docker-compose 在此更改后运行到 3307:3307。这是因为端口 3306 已被阻止此端口的本地 mysql 容器使用。我试过3307:3306,它也有效,是的,谢谢。
    【解决方案4】:

    我的一个容器也遇到了同样的问题。我尝试了所有方法,但没有任何效果,我尝试了以下操作并再次成功启动了容器

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

    【讨论】:

    • 在 Windows 中,您将在 C:\ProgramData\Docker\network\files 中找到此文件
    • 如果在运行上述命令后找不到网络,请执行 sudo docker system prune。然后 docker-compose up 应该可以正常运行了。
    • 这只是救了我 :) 太棒了...我尝试了一切,删除了带有端口的进程,删除了缓存等,但没有任何工作...您是救世主
    【解决方案5】:

    试试这个命令:

    sudo service docker restart
    

    如果没有帮助,请重新启动您的服务器。

    【讨论】:

      【解决方案6】:

      然后停止所有正在运行的容器docker ps -a -q 停止您机器上的 Docker 并重新启动它。

      【讨论】:

      • 这对我有用。对于曾经运行良好的容器,我遇到了同样的问题。这发生在修改防火墙设置之后。整个错误消息中有一个“iptables failed”。在阅读了 smishra 的评论后,我决定只启动和停止(=restart)docker,而不删除那里提到的文件,这对我有用。然后,我阅读了您的评论并意识到这基本上就是我所做的。
      【解决方案7】:

      我有同样的问题和同样的错误。 只要我的计算机中安装了本地nginx,那么通过容器运行另一个nginx 就会在端口:80 中产生冲突。 只是我试图停止我本地安装的nginx 的服务,如下所示:

      sudo service nginx stop
      

      然后,我可以毫无问题地运行 nginx by docker-compose up -d

      Creating MyWebServer ... done
      Creating mongo    ... done
      Creating redis    ... done
      

      【讨论】:

        【解决方案8】:

        当我第一次做一个简单的 docker web 应用程序时,我也遇到了同样的问题。

        您只需尝试以下步骤即可解决问题,还可以详细了解您遇到问题的原因。

        Step-1:使用命令检查所有正在运行的容器:

        docker ps
        

        第 2 步:找出在同一端口上运行的容器的容器 ID,并尝试访问。

        步骤3:使用此命令停止在同一端口上运行的容器:

        docker stop <container id> 
        

        第 4 步:再次构建容器:

        docker build -t DockerID/projectName .
        

        第 5 步:再次尝试使用端口映射在同一端口上运行您的容器。

        docker run -p 8080:8080 DockerID/projectName
        

        【讨论】:

          【解决方案9】:

          现在检查端口 80 上的内容 - sudo ss -tulpn | grep :80

          您可能正在运行 apache2。 你可以检查它 - sudo service apache2 status 如果是这样 - sudo service apache2 statop

          【讨论】:

          • 这对我有用,但我最终做的是在我的一个 VirtualBox 来宾上删除一个端口转发规则,该端口有问题。
          【解决方案10】:

          在我的例子中,端口 80 是 Web 服务器的默认端口,因此它受到保护。我将绑定更改为端口 60:8080 以确保没有更深层次的问题。将绑定更改为不同的端口允许我执行 docker run 并在浏览器中点击它http://ip:60

          【讨论】:

            【解决方案11】:

            最近这个问题开始在 Windows 上发生很多。您可以尝试重新启动 docker,或者您可以在 Windows 关闭之前手动停止 docker - docker 在重新启动时干净地启动。 2018 年 7 月 24 日,docker 问题开放,更多详细信息可以在https://github.com/docker/for-win/issues/1967找到。

            【讨论】:

              【解决方案12】:

              这似乎是与此处描述的 Windows“快速启动”不兼容的问题:(只需重新启动 docker 服务)它可能会起作用。

              https://github.com/docker/for-win/issues/2722

              这是由于与 Docker 和 fastboot 不兼容造成的。您可以确保在关闭 Windows 之前停止所有容器,也可以通过执行以下操作在 Windows 的电源设置中禁用快速启动:

              CTRL+R &gt; "powercfg.cpl" &gt; "Choose what the power buttons do" &gt; "Change settings that are currently unavailable" &gt; Deselect "Turn on fast start-up"

              如果您愿意,也可以在 powershell 中使用单个命令禁用快速启动:

              Set-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Power\' -Name HiberbootEnabled -Value 0

              【讨论】:

                【解决方案13】:

                Windows 用户:docker description

                在 Windows 系统上,CTRL+C 不会停止容器。所以,第一种类型 CTRL+C 返回提示(或打开另一个 shell),然后键入 docker container ls 列出正在运行的容器,然后是 docker container stop 停止容器。 否则,当您尝试 在下一步中重新运行容器。

                我有同样的问题,我认为用 CTRL+C 停止了容器,但事实并非如此,上面的任何答案都有效,因为它们都停止容器,重新启动 docker 或显式停止容器。

                我更喜欢:

                docker container ls #list containers running
                docker stop [container id] #replace [container id] with the container id running
                

                【讨论】:

                  【解决方案14】:

                  对我来说很简单

                  ddev poweroff
                  

                  解决了这个问题。

                  【讨论】:

                    【解决方案15】:

                    如果这种情况是使用 Redis:删除 docker-compose 文件中的 ports - ... 并让它自己分配。或将主机中的端口映射从 6379:6379 更改为 6378:6379 对我有用。

                    【讨论】:

                      【解决方案16】:

                      在我的情况下,阻止端口的是我的一个活动 VirtualBox 来宾上该端口的端口转发规则。我删除了规则,docker 不再抱怨了。

                      【讨论】:

                        【解决方案17】:

                        如果您尝试了上述所有解决方案但仍然遇到问题,您可以手动终止 LISTEN 端口,如下所示为 Linux 用户提供

                        1. sudo lsof -i -P -n | grep 听
                        2. sudo kill -9 (例如 sudo kill -9 28563 28575 28719 28804)

                        【讨论】:

                          猜你喜欢
                          • 1970-01-01
                          • 2017-11-08
                          • 2018-11-12
                          • 2021-06-27
                          • 1970-01-01
                          • 2019-06-13
                          • 2018-09-21
                          • 2021-03-04
                          • 2022-01-23
                          相关资源
                          最近更新 更多