docker:守护程序错误响应:端口不可用:侦听tcp 0.0.0.0:80:绑定错误

19

我试图在我的 Windows 10 Pro 工作站上运行一个 Docker 镜像,但是出现了以下错误:

docker: Error response from daemon: Ports are not available: listen tcp 0.0.0.0:80: bind: An attempt was made to access a socket in a way forbidden by its access permissions.

我正在运行这个命令:

docker run -d -p 80:80 docker/getting-started

并获得这个响应:

Unable to find image 'docker/getting-started:latest' locally
latest: Pulling from docker/getting-started
188c0c94c7c5: Pull complete
617561f33ec6: Pull complete
7d856acdaa9c: Pull complete
a0d3c6e28e6d: Pull complete
af69a9b963c8: Pull complete
0739f3815ad8: Pull complete
7c7b75d0baf8: Pull complete
Digest: sha256:b821569034e3b5fae03b40e64a866017067f3bf17effe185b782bdbf02179528
Status: Downloaded newer image for docker/getting-started:latest
7907f6de2b55cc2d66b5ed3a642ac1a97e5bb5ecda5fcf76ff60d7236e8fd32d
docker: Error response from daemon: Ports are not available: listen tcp 0.0.0.0:80: bind: An attempt was made to access a socket in a way forbidden by its access permissions.

我该如何运行一个Docker容器并解决这个问题?


尝试在您的主机上执行“telnet localhost 80”,是否已经有程序在监听该端口? - Frank Nielsen
是的,某些东西正在侦听端口80:`Get-Process -Id (Get-NetTCPConnection -LocalPort 80).OwningProcessHandles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
6046 0 212 6668 4 0 System`Telnet也证实了这一点。看起来只是更改端口就可以让它工作了!docker run -d -p 81:81 docker/getting-started 5a0b1202f48ef63c06d75c2f26be2a05f29aa84fe2fbdc5b66f989aa86df98f2
- Tim Dunphy
8个回答

28

帮助我最多的命令是:

net stop winnat
net start winnat

取自此处


10

通过运行PowerShell命令检查是否有进程在端口80上进行监听:

Get-Process -Id (Get-NetTCPConnection -LocalPort 80).OwningProcess

如果响应类似于这样:

 NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
------    -----      -----     ------      --  -- -----------
0     0.20       4.87       0.00       4   0 System 

然后进行接管。 终止进程或更改端口。

docker run -d -p 81:81 docker/getting-started 5a0b1202f48ef63c06d75c2f26be2a05f29aa84fe2fbdc5b66f989aa86df98f

6

docker: 守护进程的错误响应: 端口不可用: listen tcp 0.0.0.0:80: bind: An attempt was made to access a socket in a way forbidden by its access permissions.

我也在使用Docker入门教程,运行了docker run -d -p 80:80 docker/getting-started,结果得到了同样的错误。

我认为可能是Internet Information Services(IIS)已经在使用端口80。我通过前往

开始菜单 > IIS > 计算机名称 > 网站 > 默认网站 > 高亮显示默认网站

来验证这个猜测。

Left pane: computer name > Sites > Default Web Site > highlight Default Web Site, Right pane: Browse *.80 (http)

在右侧窗格中,我看到了:
浏览 *.80 (http)
是的,端口80已经在使用中!
注意:要验证是否有任何进程正在使用端口80,请运行以下命令,并查找类似以下内容的内容: Get-Process -Id (Get-NetTCPConnection -LocalPort 80).OwningProcess
 NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
 ------    -----      -----     ------      --  -- -----------
      0     0.20       2.96       0.00       4   0 System

根据 @Tim Dunphy 的回答。

解决方案 #1

停止默认网站。

  • 要么按照上述步骤进入IIS > 右侧窗格 > 管理网站 > 停止 或者
  • 使用net stop http命令,并停止使用该端口的服务。

解决方案 #2

你可能不想停止运行在80端口的IIS或其他服务,所以只需更改本地端口!例如,

docker run -d -p 81:80 docker/getting-started

很可能会奏效,只要你没有使用端口81的服务。


3
当我遇到这个错误时,该端口上没有任何正在监听的内容。然而,以下命令显示该端口已被其他程序占用。
netsh interface ipv4 show excludedportrange protocol=tcp

更多细节请参见这篇文章。我通过重新启动解决了问题。


2

大多数情况下,Windows IIS(Internet Information Service)或其他程序可能正在使用端口80,这是Laravel、Apache和其他PHP开发环境使用的默认http端口。

要解决此问题,请以管理员身份打开新的PowerShell窗口,然后运行以下命令:

net stop http

会显示一个列出所有使用http端口的服务的提示,并给您停止它们的选项。输入“Y”并按Enter键。所有服务都将停止,端口80现在可以自由地用于您想要使用的任何内容。

非常适用于在Windows本地测试多个应用程序环境,而不必担心端口配置问题。


谢谢!在我的情况下,HTTP服务被“打印池”和“分支缓存”使用。不知道后者是什么。 - matthiku

2
在我的情况下,任务管理器显示一个系统进程占用了端口80。
当我深入研究时,我发现与端口80相关的svchost.exe基于“万维网服务”。
所以,只需打开服务列表并停止万维网服务,一切都会恢复正常。服务名称可能不同,但应包含关键字:“万维网”。

1

只管去做

netsh http add iplisten ipaddress=::

(需要在以管理员身份运行的命令提示符中运行!)

1

我有一个进程阻塞了我需要为docker容器使用的端口,解决这个问题花费了很长时间。在我的情况下,PID 4也使用了端口80。

我想总结一下所有可能遇到的问题和解决方案,希望对未来的某些人有所帮助。


对于任何新手来说,您可以按照以下步骤使用相应的端口来调查服务,以尝试弄清楚它是什么。

在 Powershell 中,我们可以检查使用此端口的进程:

netstat -aon | findStr /i "LISTENING"  | findStr ":80"

要检查这是哪个进程:

tasklist /FI "PID eq 4"

使用端口获取进程ID的另一种方法:

Get-Process -Id (Get-NetTCPConnection -LocalPort 80).OwningProcess

使用以下命令检查端口是否已被其他进程占用:

netsh int ipv4 show excludedportrange protocol=tcp

同时在资源监视器中查看,看看是否能给你更多的线索。


我尝试了这里和其他帖子中提到的所有建议:

以上方法均未能释放端口。

最后,我决定检查是否有任何最近的Windows更新可能导致此问题 - 在过去的两个星期内没有发现任何新的更新。

但是,当我检查最近安装的应用程序时(使用Bulk Crap Uninstaller - 它非常好用!),我注意到昨天安装了两个“应用程序”,我肯定不是手动安装的,所以我认为它们可能通过Win Update或自动应用程序更新来安装的:

  • Microsoft Edge Webview 2 Runtime
  • Web Components

卸载这些后,我再次可以访问80端口了!

为了确保不再出现这种情况,我将该端口保留供自己使用:

netsh int ipv4 add excludedportrange protocol=tcp startport=80 numberofports=1

请不要在多个问题中发布重复的答案。 - user229044

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接