docker 启动容器报错: (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保留端口冲突了
查看hyper-v启动后的保留端口范围netsh interface ipv4 show excludedportrange protocol=tcp
协议 tcp 端口排除范围 开始端口 结束端口---------- -------- 1026 1125 1226 1325 1326 1425 1426 1525 1526 1625 2180 2279 6220 6420...
结果显示6220~6420端口被保留,其中包括了redis的6379端口,需要修改修改hyper-v保留端口,排除6379
修改hyper-v保留端口
以管理员身份运行 powershell停止Windows NAT 驱动程序net stop winnat
使用以下命令永久排除6379作为保留端口netsh int ipv4 add excludedportrange protocol=tcp startport=6379 numberofports=1 store=persistent
提示:关键在于store=persistent参数表示持久化信息
上面的命令可以通过修改numberofports参数保留startport开始的多个端口开启Windows NAT 驱动程序
net start winnat
再次运行 netsh interface ipv4 show excludedportrange protocol=tcp 命令可以看到6379端口已被排除(带有*号标记)管理员权限运行
协议 tcp 端口排除范围开始端口 结束端口---------- -------- 80 80 2379 2379 * 2380 2380 * 3306 3306 * 5357 5357 6379 6379 * 50000 50059 ** - 管理的端口排除。
其他端口号被占用同理,上面我排除了mysql、redis、etcd的端口,常用的都可以加上