解决Windows下Docker启动容器时,端口被占用错误
今天在启动本机的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.
我的环境信息
- Windows版本: Windows 11 专业版
- Docker Desktop Version: 4.3.2
- 启用Hyper-V 和 WSL2
查找问题
首选确保本机端口是否被占用,使用如下命令:
netstat -ano | findstr 6379
结果端口没有被占用
查资料之后发现 Hyper-V
会保留部分tcp端口,开始到结束范围内的端口不可用, 使用如下命令查看保留的端口:
netsh interface ipv4 show excludedportrange protocol=tcp
可以得到
协议 tcp 端口排除范围
开始端口 结束端口
---------- --------
1026 1125
1126 1225
1226 1325
1326 1425
1426 1525
1538 1637
2327 2426
2427 2526
2527 2626
2627 2726
2727 2826
2827 2926
6344 6567
50000 50059 *
50070 50070 *
* - 管理的端口排除。
可以看到6379
在排除范围内
解决办法
此时可以修改容器启动命令(主要是修改端口)重新启动容器。
这种是绕过了被保留的端口, 如果你的程序一定要使用范围内的端口,有如下三种方式
一、临时关闭Hyper-V
法
-
临时关闭
Hyper-V
-
配置端口
-
恢复
Hyper-V
二、重启电脑大法
保留的端口是随机的,每次重启电脑都会改变,因此可以通过重启电脑来解决。
三、永久排除保留端口
1、在运行 Docker 之前,以管理员身份运行 powershell
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 端口排除范围
开始端口 结束端口
---------- --------
1026 1125
1126 1225
1226 1325
1326 1425
1426 1525
1538 1637
2327 2426
2427 2526
2527 2626
2627 2726
2727 2826
2827 2926
6379 6379 *
50000 50059 *
50070 50070 *
* - 管理的端口排除。
之后再重启电脑6379
端口就不会包含在保留端口内了。
总结
三种解决方法中,第一种临时关闭Hyper-V
可以避免重启电脑,可以作为紧急解决办法。第二种重启电脑需要靠运气,第三种永久排除保留端口是最高效的。