当前位置: 首页 > news >正文

查看解决端口占用,以及docker解决端口占用的原理

在软件开发和部署过程中,端口占用是一个常见的问题。以下是查看和解决端口占用问题的完整解决方案:


一、查看端口占用情况

1. 在 Linux 系统中

方法一:使用 lsof 命令
sudo lsof -i:<端口号>
  • 输出信息中会显示占用端口的进程名称、PID 和其他详细信息。
方法二:使用 netstat 命令
sudo netstat -tuln | grep <端口号>
  • 参数说明:
    • -t:显示 TCP 连接。
    • -u:显示 UDP 连接。
    • -l:显示监听状态的端口。
    • -n:显示数字形式的地址和端口。
方法三:使用 ss 命令
sudo ss -tuln | grep <端口号>
  • ssnetstat 的替代工具,性能更高。

2. 在 Windows 系统中

方法一:使用 netstat 命令
netstat -ano | findstr :<端口号>
  • 输出中的 PID 列表示占用端口的进程 ID。
方法二:通过任务管理器查看
  1. 打开任务管理器,切换到“详细信息”或“性能”选项卡。
  2. 在“资源监视器”中找到网络相关信息,查看端口和进程。

3. 在 Mac 系统中

方法一:使用 lsof 命令
sudo lsof -i:<端口号>
方法二:使用 netstat 命令
netstat -an | grep <端口号>

二、解决端口占用问题

1. 确认占用端口的进程

根据上一步获取的 PID,找到进程的详细信息:

  • Linux/Mac
    ps -p <PID>
    
  • Windows
    tasklist /FI "PID eq <PID>"
    

2. 停止占用端口的进程

Linux/Mac
  • 使用 kill 命令结束进程:
    sudo kill -9 <PID>
    
  • 或者,使用服务管理工具停止进程:
    sudo systemctl stop <服务名>
    
Windows
  • 使用任务管理器:
    1. 打开任务管理器。
    2. 找到对应的进程,右键选择“结束任务”。
  • 使用 taskkill 命令:
    taskkill /PID <PID> /F
    

3. 更改程序的端口号

  • 修改配置文件或启动参数,指定程序使用其他未被占用的端口。

4. 临时释放端口(Linux/Mac)

有时进程可能没有完全释放端口,可以尝试:

sudo fuser -k <端口号>/tcp

5. 检查并避免端口占用的最佳实践

  1. 动态分配端口:使用随机端口而非固定端口。
  2. 启动前检查端口状态:在程序启动时,提前检查端口是否被占用。
  3. 使用容器化部署:通过 Docker 等工具隔离端口,减少冲突。
  4. 记录端口使用情况:在团队中统一记录端口使用分配。

三、使用Docker实现端口隔离

使用 Docker 可以实现端口隔离的原因,主要源于容器的虚拟化特性和网络命名空间机制。以下是详细解释:


1. 网络命名空间 (Network Namespace)

Docker 使用 Linux 的 Namespace(命名空间)技术,为每个容器创建独立的网络命名空间。这使得每个容器拥有自己的网络栈,包括:

  • 独立的 IP 地址
  • 独立的路由表
  • 独立的端口号空间

具体表现

  • 每个容器中的端口(例如 80 或 8080)仅在容器内部有效,与主机或其他容器不冲突。
  • 通过 Docker 的端口映射机制(-p 参数),容器端口可以绑定到主机端口,但这是显式的行为,而非默认暴露。

2. Docker 的端口映射机制

在默认的网络模式下(bridge 模式),Docker 不会直接暴露容器的端口到主机系统。需要通过端口映射将主机的端口显式绑定到容器的端口。

工作流程

  • 容器启动时,Docker Daemon 会根据 -p-P 参数,设置主机和容器之间的端口转发规则。
  • 通过 iptables 或类似机制,将主机端口的请求转发到容器的对应端口。
  • 如果没有显式指定端口映射,容器内的端口对外界不可访问。
示例
  • 启动一个容器,并映射端口:
    docker run -d -p 8080:80 nginx
    
    • 主机的 8080 端口映射到容器的 80 端口。
    • 外部访问 http://host-ip:8080 会转发到容器的 80 端口。
  • 如果没有 -p 参数,容器内的端口(如 80)无法通过主机直接访问。

3. 容器间的端口隔离

在默认的桥接网络模式下,每个容器的网络环境是隔离的:

  • 容器 A 的端口号不会与容器 B 冲突。
  • 容器之间不能直接访问对方的端口,除非使用 Docker 网络或链接功能显式配置连接。

4. Docker 网络模式对隔离的影响

Docker 提供多种网络模式,不同模式对端口隔离的影响有所不同:

  • Bridge 模式(默认):容器之间隔离,主机和容器之间需通过端口映射访问。
  • Host 模式
    • 容器直接使用主机的网络栈,没有端口隔离。
    • 容器内运行的服务与主机上的服务可能产生端口冲突。
  • None 模式
    • 容器没有网络栈,完全隔离,不与外界通信。
  • Custom Network(自定义网络):
    • 可以将多个容器加入同一个网络,允许它们通过容器名直接通信,但仍然保持与主机的端口隔离。

5. 为什么使用 Docker 可以实现端口隔离?

  • 每个容器运行在独立的网络命名空间。
  • 默认情况下,容器的端口不会自动暴露到主机,只有通过显式映射才能访问。
  • 容器之间的端口也彼此独立,即使使用相同的端口号也不会冲突。

总结

Docker 的端口隔离得益于网络命名空间技术和端口映射机制,使得每个容器的端口独立于主机和其他容器。这种隔离性不仅减少了端口冲突的风险,还提高了系统的安全性和灵活性。

相关文章:

查看解决端口占用,以及docker解决端口占用的原理

在软件开发和部署过程中&#xff0c;端口占用是一个常见的问题。以下是查看和解决端口占用问题的完整解决方案&#xff1a; 一、查看端口占用情况 1. 在 Linux 系统中 方法一&#xff1a;使用 lsof 命令 sudo lsof -i:<端口号>输出信息中会显示占用端口的进程名称、PI…...

力扣-Hot100-链表其一【算法学习day.34】

前言 ###我做这类文档一个重要的目的还是给正在学习的大家提供方向&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非常非常高滴&am…...

centos7 升级openssl 与升级openssh 安装卸载 telnet-server

前言&#xff1a; 服务器被安全扫描&#xff0c;扫出了漏洞需要修复&#xff0c;根据提示将openssh升级为9.8p1的版本&#xff0c;同时需要升级openssl&#xff0c;但是升级openssh可能会导致ssh连接失败&#xff0c;从而无法继续操作&#xff0c;特别是远程机房尤为危险&#…...

C++知识点总结(57):STL综合

STL综合 一、数据结构1. 队列2. 映射 二、队列例题1. 约瑟夫环&#xff08;数据加强&#xff09;2. 打印队列3. 小组队列4. 日志统计 2.0 三、映射真题1. 眼红的 Medusa2. 美食评委 一、数据结构 1. 队列 功能代码定义queue<tp>q入队.push(x)出队.pop()队头.front()队尾…...

mac2019环境 Airflow+hive+spark+hadoop本地环境安装

1 环境介绍 本地安装可分为两个部分&#xff0c;mac软件环境&#xff0c; python开发环境 ps: 安装过程参考chatgpt、csdn文章 1.1 mac软件环境 目标安装的的软件是hive、apache-spark、hadoop&#xff0c;但是这三个软件又依赖java(spark依赖&#xff09;、ssh&#xff08…...

如何使用EasyExcel生成多列表组合填充的复杂Excel示例

作者&#xff1a;Funky_oaNiu 一、&#xff08;需求&#xff09;生成的表格效果&#xff1a;二、搞一个模板文件三、建立对应的表格实体类四、开始填充五、Vue3前端发起请求下载六、官方文档及AI问答 一、&#xff08;需求&#xff09;生成的表格效果&#xff1a; 其中只有顶部…...

【MySQL】MySQL在Centos环境安装

&#x1f525;个人主页&#xff1a; Forcible Bug Maker &#x1f525;专栏&#xff1a; MySQL 目录 &#x1f308;前言&#x1f525;卸载不要的环境&#x1f525;检查系统安装包&#x1f525;卸载这些默认安装包&#x1f525;获取mysql官方yum源&#x1f525;安装mysql yum源…...

JDBC-Mysql 时区问题详解

目录 一、前置准备 1.1 版本号列表 1.2 Sql脚本 1.3 application.yaml配置 1.4 数据库时区设置 二、java Date类型与&#xff08;jdbcType&#xff09;TIMESTAMP类型的转换 2.1 jdbc对serverTimeZone的处理 2.2 java Date转&#xff08;jdbcType&#xff09;TIMESTAMP …...

前端页面一些小点

案例一&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>快递单号查询</title><…...

Postman接口测试(断言、关联、参数化、输出测试报告)

基本界面展示 Get、Post请求 Postman断言 使用postman来判断预期结果与实际结果是否一致 响应状态码断言 响应包含字符串 断言判断字符串的格式 关联 用于解决http请求之间存在依赖关系 依赖&#xff1a;一个http请求的响应结果中的数据&#xff0c;被另一个请求使用 登…...

redis和mongodb等对比分析

Redis 和 MongoDB 都是非常流行的 NoSQL 数据库,它们在数据存储模型、性能、扩展性等方面有很大的差异。下面是 Redis 和 MongoDB 的对比分析: 1. 数据模型 Redis: 键值存储:Redis 是一个内存数据结构存储,它支持多种数据类型,如字符串、哈希、列表、集合、有序集合等。…...

如何在 WordPress 中轻松强制所有用户退出登录

作为一名长期管理 WordPress 网站的站长&#xff0c;我深知维护网站安全性的重要性。尤其是在面对会员网站或付费内容平台时&#xff0c;确保所有用户的登录状态是最新的&#xff0c;是维持网站正常运营的关键之一。今天&#xff0c;我就分享一下如何通过简单的步骤&#xff0c…...

移除元素(leetcode 27)

给定一个数组&#xff0c;在数组中删除等于这个目标值的元素&#xff0c;然后返回新数组的大小 数组理论&#xff1a; 数组是一个连续的类型相近的元素的一个集合&#xff0c;数组上的删除是覆盖&#xff0c;只能由后面的元素进行覆盖&#xff0c;而不能进行真正意义上的地理位…...

html5表单属性的用法

文章目录 HTML5表单详解与代码案例一、表单的基本结构二、表单元素及其属性三、表单的高级应用与验证四、表单布局与样式 HTML5表单详解与代码案例 HTML5表单是网页中用于收集用户输入并提交到服务器的重要元素&#xff0c;广泛应用于登录页面、客户留言、搜索产品等场景。本文…...

使用 Ant Design Vue 自定渲染函数customRender实现单元格合并功能rowSpan

使用 Ant Design Vue 自定渲染函数customRender实现单元格合并功能rowSpan 背景 在使用Ant Design Vue 开发数据表格时&#xff0c;我们常常会遇到需要合并单元格的需求。 比如&#xff0c;某些字段的值可能会在多行中重复出现&#xff0c;而我们希望将这些重复的单元格合并为…...

相机光学(四十四)——ALL-PD和PDAF

1.PDAF&#xff08;Phase Detection Auto Focus&#xff09; PDAF是相位检测自动对焦技术的缩写&#xff0c;它是一种在数码相机和智能手机摄像头中使用的自动对焦技术。   PDAF的原理是根据CIS&#xff08;CMOS图像传感器&#xff09;不同像素的相位差信息&#xff0c;判断出…...

Opengl光照测试

代码 #include "Model.h" #include "shader_m.h" #include "imgui.h" #include "imgui_impl_glfw.h" #include "imgui_impl_opengl3.h" //以上是放在同目录的头文件#include <glad/glad.h> #include <GLFW/glfw3.…...

OpenSIP2.4.11 向 FreeSWITCH 注册

应朋友要求做了个简单的测试&#xff0c;花费时间不过半小时&#xff0c;记录如下&#xff1a; OpenSIPS IP 地址&#xff1a;192.168.31.213 FreeSWITCH IP 地址&#xff1a;192.168.31.166 加载 uac_registrant 模块&#xff08;这个模块依赖 uac_auth 模块&#xff0c;得…...

【C++】深入理解 C++ 优先级队列、容器适配器与 deque:实现与应用解析

个人主页: 起名字真南的CSDN博客 个人专栏: 【数据结构初阶】 &#x1f4d8; 基础数据结构【C语言】 &#x1f4bb; C语言编程技巧【C】 &#x1f680; 进阶C【OJ题解】 &#x1f4dd; 题解精讲 目录 前言&#x1f4cc; 1. 优先级队列、容器适配器和 deque 概述✨1.1 什么是优…...

Android 开发与救砖工具介绍

Android 开发与救砖工具介绍 在 Android 开发和设备维护中&#xff0c;fastboot、adb 和 9008 模式是三个非常重要的工具和模式。它们各自有不同的用途和操作方式&#xff0c;对于开发者和技术支持人员来说&#xff0c;了解它们的功能和使用方法是必不可少的。 1. Fastboot …...

vue2和vue3:diff算法的区别?

Vue 2 和 Vue 3 在 diff 算法方面的主要区别是&#xff1a; Vue 2 使用普通的 diff 算法&#xff0c;它会遍历所有的节点进行比对。 Vue 3 引入了 patch flag 的概念&#xff0c;并且对 diff 算法进行了优化&#xff0c;比如在相同层级的节点间不会去递归比对已经被移除的节点…...

后端返回大数问题

这个问题并不难,但是在开发的时候没有注意到 后端返回了一个列表数据,包含id,这个id是一个大数,列表进入详情,需要将id传入到详情页面详情页面内部通过id获取数据一直404,id不正确找问题,从路由传参到请求数据发现id没有问题,然后和后端进行联调,发现后端返回的id和我获取的id…...

vue3: ref, reactive, readonly, shallowReactive

vue3: ref, reactive, readonly, shallowReactive 原文地址:https://mp.weixin.qq.com/s/S3jPZKEMBP8nQQObF5d2VA <template><!-- <ul><li v-for"item in list.arr">{{item}}</li></ul><button click.prevent"add"…...

5G与4G互通的桥梁:N26接口

5G的商用部署进程将是一个基于4G系统进行的长期的替换、升级、迭代的过程&#xff0c;4G系统是在过渡到5G全覆盖过程中&#xff0c;作为保障用户业务连续性体验这一目的的最好补充。 因此4G/5G融合组网&#xff0c;以及互操作技术将是各大运营商在网络演进中需要重点考虑的问题…...

29-Elasticsearch 集群监控

Elasticsearch Stats 相关的 API ● Elasticsearch 提供了多个监控相关的 API ○ Node Stats&#xff1a; _nodes/stats ○ Cluster Stats: _cluster/stats ○ Index Stats: index_name/_stats Elasticsearch Task API ● 查看 Task 相关的 API ○ Pending Cluster Tasks…...

利用Excel批量生成含二维码的设备管理标签卡片

在日常办公中&#xff0c;批量制作标签是常见且繁琐的任务&#xff0c;尤其当这些标签需要包含大量数据并附带二维码以便快速扫描识别时&#xff0c;难度更是成倍增加。尽管传统的Word邮件合并功能在数据插入方面表现出色&#xff0c;但在二维码生成上却显得有些捉襟见肘。 为…...

小米运动健康与华为运动健康在苹手机ios系统中无法识别蓝牙状态 (如何在ios系统中开启 蓝牙 相册 定位 通知 相机等功能权限,保你有用)

小米运动健康与华为运动健康在苹手机ios系统中无法识别蓝牙状态 &#xff08;解决方案在最下面&#xff0c;参考蓝牙权限设置方式举一反三开启其它模块的权限&#xff09; 最近买了一台小米手表s4&#xff0c;但是苹手机ios系统中的 “小米运动健康” app 始终无法识别我手机…...

高亮变色显示文本中的关键字

效果 第一步&#xff1a;按如下所示代码创建一个用来高亮显示文本的工具类&#xff1a; public class KeywordUtil {/*** 单个关键字高亮变色* param color 变化的色值* param text 文字* param keyword 文字中的关键字* return*/public static SpannableString highLigh…...

Javascript垃圾回收机制-运行机制(大厂内部培训版本)

前言 计算机基本组成&#xff1a; 我们编写的软件首先读取到内存&#xff0c;用于提供给 CPU 进行运算处理。 内存的读取和释放&#xff0c;决定了程序性能。 冯诺依曼结构 解释和编译 这两个概念怎么理解呢。 编译相当于事先已经完成了可以直接用。好比去饭店吃饭点完上…...

【jvm】一个空Object对象的占多大空间

目录 1. 说明2. 结论 1. 说明 1.在Java中&#xff0c;一个空Object对象所占用的内存空间大小会受到JVM&#xff08;Java虚拟机&#xff09;实现和配置的影响&#xff0c;具体数值可能因不同JVM版本和配置而有所不同。2.但一般来说&#xff0c;可以基于一些通用的原则来估算这个…...