解决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

  1. 临时关闭Hyper-V

  2. 配置端口

  3. 恢复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可以避免重启电脑,可以作为紧急解决办法。第二种重启电脑需要靠运气,第三种永久排除保留端口是最高效的。

posted @ 2022-03-25 22:20  bkycmd  阅读(12432)  评论(1编辑  收藏  举报