错误:端口不可用,容器无法启动(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可以避免重启电脑,可以作为紧急解决办法。重启电脑需要靠运气,第三种永久排除保留端口是最高效的。
浙公网安备 33010602011771号