[开发工具] 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 容器或者其他服务的端口设置,以避免冲突。

相关推荐
todoitbo5 小时前
群晖NAS部署JmalCloud:Docker安装、文件管理、博客与公网访问完整教程
运维·docker·容器
是枚小菜鸡儿吖12 小时前
Home Assistant跨品牌智能家居教程:Docker部署、米家接入、vivo桥接与远程访问
docker·容器·智能家居
螺蛳粉 螺蛳粉14 小时前
第 02 篇:镜像分层与 containerd 2.x 实战:SystemdCgroup 与 pause 镜像配置踩坑(底座认知 02)
docker·云原生·容器·kubernetes·etcd·containerd·kube-apiserver
wefg115 小时前
【Docker】镜像相关指令
运维·docker·容器
java_logo16 小时前
Docker 部署 DPanel:轻松搭建轻量容器管理平台
运维·docker·容器·podman·容器管理·dpanel·轩辕镜像
死磕音视频16 小时前
Open WebUI 入门:用 Docker 装上本地对话界面并连接 Ollama
docker·ollama·本地大模型·open webui
分布式存储与RustFS16 小时前
CI 老被 Docker Hub 的 429 卡住,自建 Registry 把镜像搬进内网
运维·docker·开源·镜像仓库·对象存储·ci·rustfs
n1121217 小时前
Docker 容器时区错 8 小时:3 个坑
运维·docker·容器·故障排查·服务器运维·容器时区
慈云数据18 小时前
用 DSH 辅助部署一个网站监控平台:Uptime Kuma + Docker 实战
运维·docker·容器
螺蛳粉 螺蛳粉18 小时前
第 03 篇:为什么 K8s 的最小调度单元是 Pod 而不是容器:pause 容器与边车模式(底座认知 03)
docker·云原生·容器·kubernetes·etcd·运维排障·kube-apiserver