错误:端口不可用,容器无法启动(Error: Ports are not available)

端口占用 | 保留,导致容器无法启动

参考:https://www.cnblogs.com/uncmd/p/16056993.html

1.错误描述

本地环境信息

Windows版本: Windows 11 专业版
Docker Desktop Version: 4.3.2
启用Hyper-V 和 WSL2


启动容器 redis 时报了如下错误:

Error invoking remote method 'docker-start-container':
Error: (HTTP code 500) server error - Ports are not available:
listen tcp 0.0.0.0:6379: bind: An attempt was made to access a socket in a way forbidden by its access permissions.

2.原因排查

容器使用的端口为:6379
端口被占用,或是被 Hyper-V 保留

2.1.查看端口占用

使用命令:netstat -ano | findstr 6379
如果从列出的信息发现端口没被占用,继续下一步。

2.2.查看保留端口

使用命令:netsh interface ipv4 show excludedportrange protocol=tcp
Hyper-V 会保留部分tcp端口,开始到结束范围内的端口不可用

开始端口    结束端口
----------    --------
      2727        2826
      2827        2926
      6344        6567
     50000       50059     *
     50070       50070     *
* - 管理的端口排除。

可以看到6379在排除范围内

3.解决方法

方法一:换个端口

修改容器启动命令(主要是修改端口)重新启动容器,这种是绕过了被保留的端口,


如果一定要使用该端口,不修改端口有如下三种方式

方法二:重启电脑

  • 保留的端口是随机的,每次重启电脑都会改变,因此可以通过重启电脑来解决。

方法三:临时关闭

  • 临时关闭Hyper-V → 配置端口 → 恢复Hyper-V

方法四、永久排除保留端口

1、以管理员身份运行 powershell 或 cmd
2、使用以下命令永久排除6379作为保留端口(如果端口被占用需要重启一次电脑)
netsh int ipv4 add excludedportrange protocol=tcp startport=6379 numberofports=1 store=persistent
提示:"store=persistent"参数表示持久化信息,上面的命令可以通过修改"numberofports"参数保留"startport"开始的多个端口
3、再次运行 netsh interface ipv4 show excludedportrange protocol=tcp 命令可以看到6379端口已被排除(带有*号标记)
协议 tcp 端口排除范围

开始端口    结束端口
----------    --------
      2727        2826
      2827        2926
      6379        6379     *
     50000       50059     *
     50070       50070     *

* - 管理的端口排除。`

之后再重启电脑6379端口就不会包含在保留端口内了。

总结

三种解决方法中,临时关闭Hyper-V可以避免重启电脑,可以作为紧急解决办法。重启电脑需要靠运气,第三种永久排除保留端口是最高效的。

posted on 2022-11-03 12:30  これから  阅读(1651)  评论(0)    收藏  举报

导航