Windows | Docker容器的端口无法正常工作

Apr 25, 2025

问题

docker容器监听报错

Error response from daemon: Ports are not available: exposing port TCP 0.0.0.0:4308 -> 0.0.0.0:0: listen tcp 0.0.0.0:4308: bind: An attempt was made to access a socket in a way forbidden by its access permissions.

使用netstat -ano也没有其他服务占用端口

解决

通过netsh interface ipv4 show excludedportrange protocol=tcp发现,需要监听的端口被包含在里面。

...
4084-4133
4134-4233
4234-4333
4306-4456
4709-4808
4809-4908
4909-5008
5041-5140
5357-5357
50000-50059
...

使用netsh int ipv4 show dynamicport tcp发现保留端口号是从1024开始的。

根本原因归结于 Windows 的“TCP 动态端口范围”,并且可能由于 Hyper-V 预留的端口号导致冲突。

solution 1

在原有保留端口中排除特定端口

  1. 禁用 Hyper-V(这将需要重启几次)

    dism.exe /Online /Disable-Feature:Microsoft-Hyper-V
    
  2. 完成所有必要的重启后,预留你需要的端口,以防 Hyper-V 重新占用该端口。

    netsh int ipv4 add excludedportrange protocol=tcp startport={your port} numberofports=1
    
  3. 重新启用 Hyper-V(这将需要重启几次)

    dism.exe /Online /Enable-Feature:Microsoft-Hyper-V /All
    

solution 2

重置“TCP 动态端口范围”,使 Hyper-V 只预留我们设置的端口范围

netsh int ipv4 set dynamic tcp start=49152 num=16384
netsh int ipv6 set dynamic tcp start=49152 num=16384

https://inasa.dev/posts/rss.xml