Docker: 驱动程序在端点 Web 服务器上编程外部连接失败

我试图运行一个码头示例 按照这个文件

这是我的命令:

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

但我得到了这个错误:

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

我该怎么补救?

278945 次浏览

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

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

我的一个集装箱也有同样的问题。我尝试了所有的方法,但是没有什么效果,我尝试了下面的方法,成功地再次启动了容器

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

如果你是使用端口 i 没有,尝试重新启动码头。这通常为我工作。

enter image description here

最近这个问题在 Windows 上开始频繁出现。您可以尝试重新启动 docker 或者您可以手动停止 docker 在 Windows 关闭之前-docker 在重新启动时干净地启动。关于2018年7月24日的码头问题是开放的,进一步的细节可以在 https://github.com/docker/for-win/issues/1967找到

Windows 用户: 码头描述

在 Windows 系统中,CTRL + C 不会停止容器 CTRL + C 返回提示符(或打开另一个 shell) ,然后键入 Docker 容器是列出正在运行的容器,然后是 docker 集装箱停止停止集装箱。 否则,当您尝试 在下一步中重新运行容器。

我遇到了同样的问题,我认为使用 CTRL + C 可以停止容器,但事实并非如此,上面的任何答案都是有效的,因为它们都是停止容器、重新启动码头或明确地停止容器。

我更喜欢:

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

这似乎是一个与 Windows“快速启动”不兼容的问题,如下所述: (只需重新启动 docker 服务) ,它可能会工作。

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

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

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

如果你愿意的话,你也可以在 powershell 中使用一个简单的命令来禁用 fast boot:

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

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

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

试试重启码头服务,99% 的时间都能正常工作。

service docker restart

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

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

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

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

试试这个命令:

sudo service docker restart

如果不起作用,请重新启动服务器。

第一次,当我做一个简单的网页应用程序,我也面临着同样的问题。

简单地说,您可以尝试以下步骤来解决问题,并且能够详细地了解您为什么要面对这个问题。

步骤1: 使用以下命令检查所有正在运行的容器:

docker ps

步骤2: 找出运行在同一端口上的容器的容器 ID,您试图达到的。

enter image description here

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

docker stop <container id>

步骤4: 再次构建容器:

docker build -t DockerID/projectName .

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

docker run -p 8080:8080 DockerID/projectName

检查一下80端口上有什么 sudo ss -tulpn | grep :80

你可以让 apache2运行。 你可以检查它-sudo service apache2 status 如果是的话-sudo service apache2 statop

对我来说,很简单

ddev poweroff

解决了这个问题。

如果是 Redis 的情况: 删除 docker-compose 文件中的 ports - ... ,让它自己分配。或者将主机中的端口映射从 6379:6379更改为适合我的 6378:6379

如果您尝试了以上所有解决方案,但仍然存在问题,您可以手动关闭 LISTEN 端口,如下所示

  1. enter image description here
  2. Sudo kill-9 < process _ pid > (例如 sudo kill-928563285752871928804)

我有同样的问题,同样的错误。 只要我有一个本地 nginx安装在我的计算机,运行另一个 nginx通过容器在港口 :80冲突。 只是我试图停止服务,我的本地安装 nginx如下:

sudo service nginx stop

然后,我可以运行 nginxdocker-compose up -d没有任何问题:

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