docker 将容器程序的端口号映射到宿主机的端口号,是一个 nat 过程,这个过程可能会因为与 windows nat 服务冲突而失效。
所以启动 docker 时先关闭 nat 服务。
一、问题描述
试图启动一个 nacos 容器时,docker 报错:
(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 打开终端界面:
netstat -ano | findstr "8848"
寻找占用了 :8848的进程,但无结果。说明实际并无 tcp 进程占用该端口。
三、解决方案
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 容器或者其他服务的端口设置,以避免冲突。
以上就是docker启动容器报错:ports are not available的解决方案的详细内容,更多关于docker报错ports are not available的资料请关注代码网其它相关文章!
发表评论