解决docker启动容器时,端口被占用错误

本文介绍了解决Win10环境下Hyper-V导致的特定端口不可用问题,通过调整应用程序端口设置及禁用Hyper-V的方法成功启动了Kafka容器。

今天在启动本机的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 保留端口占用问题 <-此链接介绍了配置方式

### 解决方案 当遇到 Nginx 容器端口已被占用而无法启动的问题,可以采取以下方法来排查并解决问题。 #### 方法一:更改 Docker Compose 文件中的映射端口配置 如果默认的 `80` 端口已经被其他进程或容器占用,则可以通过修改 Docker Compose 配置文件中的端口映射设置来解决此问题。例如,在Compose文件中定义如下内容: ```yaml nginx: build: context: ./nginx dockerfile: Dockerfile.dev ports: - "8080:80" ``` 通过将宿主机上的 `80` 端口更改为未被占用端口(如 `8080`),从而避免冲突[^1]。 #### 方法二:检查当前已使用的端口号 在尝试重新运行 Nginx 容器之前,应先确认是否有其他程序正在使用目标端口。可以在 Linux 或 macOS 上执行以下命令以查找占用指定端口的服务: ```bash sudo lsof -i :80 ``` 或者对于 Windows 用户来说,可利用 PowerShell 运行下面这条指令获取相同的信息: ```powershell Get-Process -Id (Get-NetTCPConnection -LocalPort 80).OwningProcess ``` 一旦识别到具体哪个应用程序占用了该端口之后,可以选择停止它或将它的监听地址调整至另一个可用位置[^2]。 #### 方法三:强制移除旧版本容器实例 有即使删除了一个失败状态下的容器镜像及其关联数据卷后仍会残留一些资源影响新创建过程顺利完成。此建议清理所有相关联的对象再重试构建流程: ```bash docker ps -a | grep 'Exited' | awk '{print $1}'| xargs docker rm docker volume prune -f ``` 接着按照正常步骤继续操作直至成功部署完成为止[^3]: ```bash sh build.sh version 1.0.0 cd ../../auto_setup cp ../server/im-server-1.0.0.tar.gz im-server-1.0.0.tar.gz tar -zxvf im-server-1.0.0.tar.gz cd im-server-1.0.0 sh sync_lib_for_zip.sh mysql -uroot -p12345 source /TeamTalk/auto_setup/mariadb/conf/ttopen.sql; show tables; ``` 以上就是针对Docker环境中Nginx由于端口冲突引起错误情况的一些常见处理办法总结说明。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值