今天在启动本机的kafka容器时, 报了如下错误:
docker: Error response from daemon: Ports are not available: listen tcp 0.0.0.0:9091: bind: An attempt was made to access a socket in a way forbidden by its access permissions.
本机的环境是:
win10 64
docker desktop 3.2.1
机器有启用hyper-v (罪魁祸首)
使用netstat -ano | findstr 9091
排查是否有程序占用了9091
端口, 结果为没有.
在此之前, idea启动tomcat时, 以debug
模式会报, debug
的端口被占用, 以run
模式启动, 会报1099
端口被占用. 当时发现如果重启电脑, 直接开启idea, 可以正常启动(怀疑是被什么占用了, 和它抢速度…)
google之后发现, hyper-v会保留部分tcp端口, 使用命令:
netsh interface ipv4 show excludedportrange protocol=tcp
可以得到:
协议 tcp 端口排除范围
开始端口 结束端口
---------- --------
5357 5357
6821 6920
6944 7043
7118 7217
7218 7317
8201 8300
9055 9154
9169 9268
9330 9429
9783 9882
9883 9982
13628 13727
13954 14053
31082 31082
50000 50059 *
* - 管理的端口排除。
赫然发现9091
在排除范围之内, 于是修改启动命令(主要是修改端口):
docker run -d --name kafka --publish 9155:9092 --link zookeeper --env KAFKA_ZOOKEEPER_CONNECT=10.123.2.22:2181 --env KAFKA_ADVERTISED_HOST_NAME=10.123.2.22 --env KAFKA_ADVERTISED_PORT=9092 wurstmeister/kafka
容器可以正常启动.
我这种是绕过了被保留的端口, 如果你的程序一定要使用范围内的端口, 可以参考以下链接, 其介绍了配置保留端口的方式. 基本上是:
1.暂时关闭hyper-v
2.配置端口
3.恢复hyper-v
引用链接:
ports-are-not-available-listen-tcp-0-0-0-0-50070-bind-an-attempt-was-made-to <-此链接是我解决问题的入口
解决 win10 hyper-v 保留端口占用问题 <-此链接介绍了配置方式