启动用户态代理时出错:绑定 0.0.0.0:80:意外错误权限被拒绝
Posted
技术标签:
【中文标题】启动用户态代理时出错:绑定 0.0.0.0:80:意外错误权限被拒绝【英文标题】:Error starting userland proxy: Bind for 0.0.0.0:80: unexpected error Permission denied 【发布时间】:2018-03-13 23:52:46 【问题描述】:我在 Windows 10 Pro 下运行最新的 Docker CE 17.09,并使用两个不同的示例得到Permission denied。
Docker 站点示例:
docker run -d -p 80:80 --name webserver nginx
AWS 站点 Docker 示例:
docker run -p 80:80 hello-world
两者都返回相同的错误。
docker:来自守护进程的错误响应:驱动程序未能在端点 XXXXX 上编程外部连接:启动用户级代理时出错:绑定 0.0.0.0:80:意外错误权限被拒绝。
【问题讨论】:
【参考方案1】:在 macOS Mojave 版本 10.14.2 上,此命令对我有用:
sudo apachectl stop
在执行这个命令之前,运行
sudo lsof -i -P | grep "LISTEN"
并检查httpd
是否是:80
上的侦听器的标识符,例如:
如果是,那么实际上是 Mac apache 导致了问题。
【讨论】:
这对 Mac 来说很棒;但这个问题与 Windows 有关。 @GeorgeStocker,是的,你是对的。但由于这个问题让我找到了解决问题的方法(同样适用于其他操作系统),因此我认为这对与我有类似问题的人可能会有所帮助。【参考方案2】:侦听特权端口(低于 1024)需要来自内核的特殊 capabilities。
你有两个选择:
1 ) 以 root 身份运行您的容器 - 不要这样做。
2 ) 只为容器提供相关功能 - 在您的情况下,它的 NET_BIND_SERVICE
功能将套接字绑定到特权端口。
因此,如果您使用的映像默认以 root 身份运行 - 请确保首先创建一个非 root 用户并将其附加到一个组 - 将此行添加到您的 Dockerfile:
RUN set -x \
&& addgroup --system --gid 101 nginx \
&& adduser --system --disabled-login --ingroup nginx --no-create-home --home /nonexistent --gecos "nginx user" --shell /bin/false --uid 101 nginx
并仅使用net_bind_service
运行容器:
docker run -it -p 8080:80 --cap-drop all --cap-add net_bind_service <image-name>:<tag>
【讨论】:
【参考方案3】:1,docker run -p 80:80 nginx
如果命令 1 不起作用,请尝试命令 2。
2、docker run -d -p 8080:80 --name webserver nginx
然后转到浏览器并输入 localhost:8080
以上命令即可解决。
【讨论】:
【参考方案4】:验证宿主机中的nginx是否启动并停止。
sudo service nginx stop
【讨论】:
【参考方案5】:遇到同样的问题,我的容器在尝试启动容器时无法启动并显示以下错误消息:
来自守护程序的错误响应:驱动程序未能在端点上编程外部连接.....启动用户级代理时出错:绑定 0.0.0.0:1521:意外错误权限被拒绝。
使用以下命令启动 oracle 容器:
docker run -d -p 1521:1521 ...
对我来说,我认为这是未正确卸载的已卸载 oracle 实例的结果。端口仍然使用什么的。但只需更改为另一个端口即可解决问题,如下所示:
docker run -d -p 1523:1521 ...
【讨论】:
【参考方案6】:问题是您没有权限在端口 80 中运行映像。为此,请在 docker run 命令中添加 --user root。这将提供 root 权限并运行。
【讨论】:
【参考方案7】:您应该采取的第一个行动是运行命令:
netstat -aon | findstr [port#]
这将告诉您进程是否在给定端口上运行。如果是这种情况,那么您可以使用以下命令终止该进程:
taskkill /PID [PID] /F
这将终止使用该端口的进程。然后,您将能够将新进程绑定到端口。
我也遇到过netstat -aon
没有返回一个进程正在为我想要使用的端口运行但它确实有一个进程正在运行它不允许我运行新进程的时间在港口。我能够通过以下方式解决问题:
以带网络的安全模式启动 Windows
在 powershell/cmd 中运行命令:
netsh int ipv4 add excludedportrange protocol=tcp startport=[PORT] numberofports=1
这将保留端口,因此当您重新启动到正常的 Windows 模式时,没有应用程序会在您使用它之前窃取该端口。
【讨论】:
【参考方案8】:在以管理员身份从 CMD 窗口运行 Docker 命令的 Windows 10 Pro 上,我仍然遇到问题(根据上面的@mikael-chudinov)。 我真的很想使用端口 80,所以其他答案不适合我。
请参阅 Jens 的这篇博文,地址为 www.jens79.de
在 powershell 中,运行命令:
Get-NetTCPConnection -LocalPort 80 | Format-List
这对我来说显示了一个 pid = 4 的单个进程
在系统监视器中,这是“系统”进程,但根据上面列出的文章,它实际上是作为“万维网发布服务”运行的 IIS。
假设您不需要运行 IIS,在 Windows 服务控制台中,停止并禁用“万维网发布服务”,然后重试。
【讨论】:
【参考方案9】:这对我有帮助。错误消息中提到的端口确实在保留端口范围之一内:Windows can't bind to port above 49690
【讨论】:
【参考方案10】:我也有同样的问题。如果您的系统上已经安装了代理,那么容器端口被代理包围,您需要使用代理运行一次容器,下次不需要这样做.
【讨论】:
【参考方案11】:我在 Windows 10 Pro 上解决了我的问题,结果我以某种方式打开了万维网发布服务。在通过netstat -a -n
注意到我在某处/不知何故有一个 :80 听众后,我花了一段时间才找到。傻我。把它关掉,我对 80 端口没问题。
【讨论】:
要杀死这些端口,请使用 GUI 实用程序,nirsoft.net/utils/cports.html 在我的例子中,我使用netstat -a -n -o
来获取PID,结果是System
。决定暴露不同的端口
@MichalCiechan 我也是
你能告诉我如何关闭它吗?
天哪,谢谢谢谢谢谢!几周来我一直认为这是一个权限问题,这让我很生气。最后,一个实际的解决方案。【参考方案12】:
我最近在尝试加载 docker 环境以维护旧项目时遇到了这个问题。在我的例子中,Apache 的默认实例在最近一次操作系统更新后在我的 Mac 上运行,并且需要在端口 80 可用之前关闭。您可以使用以下命令将其关闭:
sudo /usr/sbin/apachectl stop
如果您仍然遇到问题,可以使用以下命令查看给定端口(在本例中为 80)上运行的 PID:
lsof -t -i :80
您可以尝试使用 kill 命令关闭这些端口上正在运行的任何东西;只要确保你不会杀死任何重要的东西!
kill $(lsof -t -i :80)
【讨论】:
【参考方案13】:使用以下命令更改端口:
docker container ls //show the container infos, note the ports info.
docker stop webserver
docker rm webserver //shut down currently webserver
docker run -d -p 8080:80 --name webserver nginx (or 8000:80)
最后我们在浏览器中输入localhost:8080来显示连接是否成功。
【讨论】:
docker rm
不会关闭您的网络服务器,但会删除您的容器。
非常感谢.. 简单而不是寻找端口。很多进程使用端口 80【参考方案14】:
VisualStudio 正在使用该端口,未进行调试。关闭 VS 然后重新打开。
【讨论】:
【参考方案15】:问题是通用端口,如80
、443
、22
、..(通常端口 1024)受系统保护,因此您需要权限才能使用它们,这里将足以成为系统管理员并以管理员身份执行命令。
如果它不必是:80
,请尝试使用其他端口,例如:8080
,如果这没有帮助并且错误没有改变,那么问题就更深了。
【讨论】:
这对我有用。如果我以管理员身份运行命令提示符,它就可以工作。 以管理员身份执行命令对 Windows 10 专业版没有帮助。尝试了 cmd shell 和 PowerShell。【参考方案16】:我收到此错误的原因是该端口已在使用中。更改为不同的端口,我不再收到此错误。
【讨论】:
以上是关于启动用户态代理时出错:绑定 0.0.0.0:80:意外错误权限被拒绝的主要内容,如果未能解决你的问题,请参考以下文章
启动 apache 失败(无法绑定到地址 0.0.0.0:80)
启动 apache 失败(无法绑定到地址 0.0.0.0:80)
docker-proxy - 尝试在 443 上绑定时启动用户级代理时出错