问题描述
在 Docker for Windows 中,无论是否启用基于 WSL 2 的引擎,都需要 Hyper-V 服务的支持。最近在使用 Tomcat 调试程序时,提示 “address localhost:1099 is already in use”,想着是什么程序占用了 1099 端口,使用 netstat -ano | findstr 1099
命令查询 1099 端口占用情况,结果为空,说明端口未被具体运行中的程序占用,那么就有可能是 1099 端口被系统保留了。亦尝试更换 tomcat 的 1099 端口为其他端口,结果无异。
经过一番搜索,确定了是按照 Docker 后 Hyper-V 保留了系列端口,而 1099 就在其中。
解决方案
解决方法是释放被保留的端口。
1、首先确定问题,管理员模式执行 cmd 命令,查看系统保留的端口范围:
netsh interface ipv4 show excludedportrange protocol=tcp
查看要使用的端口是否在保留端口范围中,如果在其中,则说明是端口保留问题,可以继续后续操作。
2、暂时停止 Hyper-V 服务,管理员模式执行 CMD 命令:
dism.exe /Online /Disable-Feature:Microsoft-Hyper-V
成功关闭 Hyper-V 服务后重启计算机。
3、把所需端口移出排除端口之列,比如解除 1099 端口的保留状态,让他可以为 tomcat 等程序使用,管理员模式执行 CMD 命令:
netsh int ipv4 delete excludedportrange protocol=tcp startport=1099 numberofports=1
4、重新启用 Hyper-V 服务,管理员模式执行 CMD 命令:
dism.exe /Online /Enable-Feature:Microsoft-Hyper-V /All
启用后重启计算机,这样 1099 端口就能继续使用。
备选方案
本文的解决方法是单独将需要使用的端口移出端口保留范围,有另外一个方法是停用 Hyper-V 服务后重新设置 Hyper-V 的端口保留范围,使其不要将我们需要用到的端口囊括其中,详细做法参考: