[开发工具] Docker 启动容器报错:Ports are not available

Docker 将容器程序的端口号映射到宿主机的端口号,是一个 NAT 过程,这个过程可能会因为与 Windows NAT 服务冲突而失效。

所以启动 Docker 时先关闭 NAT 服务。

一、问题描述

试图启动一个 nacos 容器时,Docker 报错:

bash 复制代码
(HTTP code 500)   
server error - Ports are not available: 
exposing port TCP 0.0.0.0:8848 -> 0.0.0.0:0: listen tcp 0.0.0.0:8848: bind: 
An attempt was made to access a socket in a way forbidden by its access permissions.

二、问题分析

通常这意味着宿主机的端口号被占用了。
Windows 打开终端界面:

sh 复制代码
netstat -ano | findstr "8848"

寻找占用了 :8848的进程,但无结果。说明实际并无 TCP 进程占用该端口。

三、解决方案

bash 复制代码
net stop winnat
docker start container_name
net start winnat

四、拓展

1. winnat 是什么

net start winnat 是一个 Windows 命令行命令,用于启动 Windows 网络地址转换 (Windows Network Address Translation, WinNAT) 服务。WinNAT 是 Windows 中的一个内置服务,它提供了网络地址转换 (NAT) 功能。

NAT 是一种网络技术,它允许一个 IP 地址空间中的设备在另一个 IP 地址空间中被看到。这通常用于在私有网络(例如家庭或办公室网络)和公共网络(例如互联网)之间进行通信。

当你运行 net start winnat 命令时,Windows 会尝试启动 WinNAT 服务。如果服务已经在运行,它将显示一个消息,告诉你服务已经启动。如果服务没有运行,它将尝试启动服务,并显示一个消息,告诉你服务是否成功启动。

请注意,你可能需要管理员权限才能运行 net start winnat 命令。如果你没有管理员权限,你可能会收到一个错误消息。

2. 为何 winnat 会与 Docker 容器冲突

NAT(网络地址转换)服务和 Docker 容器的启动可能会有冲突,主要是因为它们都可能需要使用到同一些网络端口。

Docker 在启动容器时,会根据 Dockerfile 或者 docker run 命令中的设置,将容器内的某些端口映射(绑定)到宿主机的端口,以便外部可以通过宿主机的端口访问到容器内的服务。这个过程实际上就是一个 NAT 过程,因为它将容器内的 IP 地址和端口转换为了宿主机的 IP 地址和端口

然而,如果宿主机上已经有其他服务(例如 NAT 服务)占用了这个端口,那么 Docker 就无法成功绑定这个端口,从而导致容器启动失败。这就是为什么 NAT 服务可能会影响 Docker 容器启动的原因。

因此,如果你在启动 Docker 容器时遇到了端口冲突的问题,你需要检查一下是不是有其他服务(如 NAT 服务)已经占用了这个端口,如果是的话,你可能需要更改 Docker 容器或者其他服务的端口设置,以避免冲突。

相关推荐
Sheffield2 天前
Docker的跨主机服务与其对应的优缺点
linux·网络协议·docker
Sheffield2 天前
Alpine是什么,为什么是Docker首选?
linux·docker·容器
马艳泽3 天前
win10下运行Start Broker and Proxy报错解决
docker
用户13573999256603 天前
Windows 从 0 搭建 WSL2 原生 AI 开发环境:Codex + Docker + VSCode
docker
vi_h4 天前
在 macOS 上通过 Docker 安装并运行 Ollama(详细可执行教程)
macos·docker·ollama
黑心老魔4 天前
通过 Docker 创建开发环境
docker·开发环境
冬奇Lab4 天前
一天一个开源项目(第41篇):Workout.cool - 现代化开源健身教练平台,训练计划与进度追踪
docker·开源·资讯
天朝八阿哥4 天前
使用Docker+vscode搭建离线的go开发调试环境
后端·docker·visual studio code
阿虎儿5 天前
Docker安装(非sudo用户可用)
docker
fetasty7 天前
rustfs加picgo图床搭建
docker