我在Windows 10 Pro下运行最新的Docker CE,17.09,并使用两个不同的示例获得权限被拒绝。
Docker站点示例:
docker run -d -p 80:80 --name webserver nginx
AWS站点Docker示例:
docker run -p 80:80 hello-world
都返回了同样的错误。
docker:来自守护程序的错误响应:驱动程序在端点 XXXXX 上编程外部连接失败:启动userland代理时出错:绑定0.0.0.0:80:意外错误权限被拒绝。
答案 0 :(得分:50)
我在Windows 10 Pro上解决了我的问题,结果发现我以某种方式开启了万维网发布服务。我花了一段时间才发现,经过netstat -a -n
注意到我有一个:80听众/某种方式。傻我。关闭它,我对端口80很好。
答案 1 :(得分:23)
使用以下命令更改端口,如下:
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以显示浏览器中的连接是否成功。
答案 2 :(得分:13)
问题是常用端口,如80
,443
,22
,..(通常端口< 1024
)受系统保护,因此您需要使用它们的权限,在这里它足以成为系统管理员并以管理员身份执行命令。
如果不必:80
尝试使用其他端口,例如:8080
,如果这不起作用并且错误没有改变,则问题更进一步。
答案 3 :(得分:7)
在macOS Mojave版本10.14.2上,此命令对我有用:
private ArrayList<PMenus> goodModelArrayList;
在执行此命令之前,运行
findMinimum = filter =<< (. fst) . (==) . minimum . map fst
,然后检查sudo apachectl stop
是否是sudo lsof -i -P | grep “LISTEN"
上侦听器的标识符,例如:
如果是,则实际上是Mac apache导致了问题。
答案 4 :(得分:2)
VisualStudio正在使用该端口,而没有进行调试。关闭VS,然后重新打开。
答案 5 :(得分:2)
您应该采取的第一步操作是运行命令:
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模式时,没有应用程序会在使用该端口之前盗用该端口。
答案 6 :(得分:1)
我最近在尝试加载Docker环境以维护旧项目时遇到了这个问题。就我而言,Apache的默认实例是在最近的OS更新后在我的Mac上运行的,需要在端口80可用之前关闭。您可以使用以下命令将其关闭:
sudo /usr/sbin/apachectl stop
如果仍然遇到问题,可以使用以下命令查看给定端口(在本例中为80)上正在运行的端口的PID:
lsof -t -i :80
您可以使用kill命令尝试关闭这些端口上正在运行的任何设备;只要确保您不会杀死任何重要的东西即可!
kill $(lsof -t -i :80)
答案 7 :(得分:1)
这帮助了我。错误消息中提到的端口确实在保留的端口范围之一内:Windows can't bind to port above 49690
答案 8 :(得分:1)
在特权端口(小于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>
答案 9 :(得分:0)
我也有同样的问题。如果您的系统上已经安装了 proxy ,则容器端口被代理所包围,您需要使用代理运行一次容器,而下次则无需这样做
答案 10 :(得分:0)
在Windows 10 Pro(具有作为管理员)从CMD窗口运行Docker命令的情况下,我仍然遇到问题(根据上述@ mikael-chudinov)。 我真的想使用端口80,所以其他答案都不适合我。
请在www.jens79.de上查看Jens的这篇博客文章
在powershell中,运行命令:
Get-NetTCPConnection -LocalPort 80 | Format-List
这对我来说显示了pid = 4的单个过程
在系统监视器中,这是“系统”过程,但是根据上面列出的文章,它实际上是IIS,它以“万维网发布服务”运行。
假设您不需要运行IIS,请在Windows服务控制台中,停止并禁用“万维网发布服务”,然后重试。
答案 11 :(得分:0)
问题是您无权在端口80中运行映像。为此,请在docker run命令中添加-root用户。这将提供root特权,它将运行。
答案 12 :(得分:0)
有同样的问题,我的容器无法启动,并且在尝试启动容器时显示以下错误消息:
守护程序的错误响应:驱动程序无法在端点上编程外部连接.....启动用户级代理时出错:绑定0.0.0.0:1521:意外错误权限被拒绝。
使用以下命令来启动oracle容器:
docker run -d -p 1521:1521 ...
对我来说,我认为这是未正确卸载的oracle实例的结果。端口仍然使用或其他东西。但是只需更改为另一个端口即可解决此问题,如下所示:
docker run -d -p 1523:1521 ...
答案 13 :(得分:0)
验证主机中的nginx是否已启动并停止。
scp <IP>:<remote file> <local file>
答案 14 :(得分:0)
1,docker run -p 80:80 nginx
如果命令1不起作用,请尝试命令2。
2,docker run -d -p 8080:80 --name webserver nginx
然后转到浏览器并输入localhost:8080
以上命令将解决