今天在启动本机的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.
我的环境信息
首选确保本机端口是否被占用,使用如下命令:
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
提示:上面的命令可以通过修改
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
可以避免重启电脑,可以作为紧急解决办法。第二种重启电脑需要靠运气,第三种永久排除保留端口是最高效的。