Linux办理port is already allocated 端口已分配问题

打印 上一主题 下一主题

主题 967|帖子 967|积分 2901


在Linux系统中,当你运行Docker容器或其他服务时,如果遇到port is already allocated错误,这意味着你试图绑定到一个已经被其他进程占用的端口。
办理此类问题,通常可以采用下面步骤操纵
找出哪个进程占用了端口

方式一:lsof下令

  1. lsof -i :<port_number>
复制代码
这个下令会列出所有绑定到指定端口 <port_number> 的进程。输出结果中,PID列表现的就是对应进程的ID。
留意:冒号【:】后面不要带空格;否则会出现unacceptable port specification in的错误提示。
方式二:netstat下令

  1. netstat -tulpn | grep :<port_number>
复制代码
这个下令将展示所有TCP毗连以及监听中的UDP端口,并通过管道共同 grep 过滤出指定端口号的行。在输出信息中,可以看到对应的PID/Program name。
方式三:ss下令

  1. ss -plnt | grep :<port_number>
复制代码
ss 是一个用来分析 socket 统计信息的工具,它提供了比 netstat 更高效更详细的输出。
停止占用端口的进程

找到占用端口的PID(进程ID),然后使用kill下令竣事该进程
  1. kill <pid>
复制代码
如果是Docker容器占用

如果发现是某个Docker容器占用了端口,可以先列出所有正在运行的容器,并查找与问题端口相关的容器:
表现当前正在运行的容器
  1. docker ps
复制代码
表现所有状态的容器
  1. docker ps
  2. -a
复制代码
Docker容器的状态共有 7 种:created|restarting|running|removing|paused|exited|dead。
表现所有正在运行容器及其端口映射
  1. docker ps
  2. --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}"
复制代码
停止并移除容器
  1. docker stop <container_id_or_name>
  2. docker rm <container_id_or_name>
复制代码
重新映射端口

如果你需要同时运行多个服务且它们都希望使用相同的端口,你可以为新的Docker容器映射不同的主机端口
  1. docker run -p <new_host_port>:<container_port> ...
复制代码
为什么不直接kill掉Docker占用端口进程

在Docker容器中,如果你知道某个进程的PID,并且想要竣事该进程,理论上你可以使用 kill pid 下令来停止它。但是通常并不推荐,这是因为:

  • 隔离性: Docker容器内部运行的所有进程都在一个独立的命名空间内,这意味着宿主机上的直接PID可能与容器内部的PID不一致。你需要首先通过 docker exec 进入容器情况,然后获取并使用容器内的PID执行下令。
  • 容器管理: 正常情况下,应该通过Docker提供的接口来管理容器及其内部服务。比如,使用 docker stop 或 docker kill 来停止或强制停止整个容器,这将确保容器按照预期的方式关闭所有服务和资源。
  • 服务稳固性: 如果直接杀掉容器中的某个进程,而不思量容器的整体状态和服务依赖关系,可能会导致容器内部的服务状态非常、数据丢失或其他未预见的问题。
  • 服务重启策略: 在很多场景下,Docker容器会配置为自动重启失败的服务,而直接在容器内部杀死进程可能违反了这种重启策略,使得容器无法正常恢复到盼望状态。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

笑看天下无敌手

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表