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

news2024/11/17 13:43:03

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


一、查看端口占用情况

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2242195.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TCP/IP--Socket套接字--JAVA

一、概念 Socket套接字&#xff0c;是由系统提供⽤于⽹络通信的技术&#xff0c;是基于TCP/IP协议的⽹络通信的基本操作单元。 基于Socket套接字的⽹络程序开发就是⽹络编程。 二、分类 1.流套接字 使用传输层TCP协议。TCP协议特点&#xff1a;有链接、可靠传输、面向字节流…

号卡分销系统,号卡系统,物联网卡系统源码安装教程

号卡分销系统&#xff0c;号卡系统&#xff0c;物联网卡系统&#xff0c;&#xff0c;实现的高性能(PHP协程、PHP微服务)、高灵活性、前后端分离(后台)&#xff0c;PHP 持久化框架&#xff0c;助力管理系统敏捷开发&#xff0c;长期持续更新中。 主要特性 基于Auth验证的权限…

平衡二叉搜索树之 红黑 树的模拟实现【C++】

文章目录 红黑树的简单介绍定义红黑树的特性红黑树的应用 全部的实现代码放在了文章末尾准备工作包含头文件类的成员变量和红黑树节点的定义 构造函数和拷贝构造swap和赋值运算符重载析构函数findinsert【重要】第一步&#xff1a;按照二叉搜索树的方式插入新节点第二步&#x…

线性数据结构

数组 数组&#xff08;Array&#xff09; 是一种很常见的数据结构。它由相同类型的元素&#xff08;element&#xff09;组成&#xff0c;并且是使用一块连续的内存来存储。 我们直接可以利用元素的索引&#xff08;index&#xff09;可以计算出该元素对应的存储地址。 数组…

GoFly框架使用vue flow流程图组件说明

Vue Flow组件库是个高度可定制化的流程图组件&#xff0c;可用于工作流设计、流程图及图表编辑器、系统架构展示。可以根据自己的需求&#xff0c;设计独特的节点和边&#xff0c;实现个性化的流程图展示。这不仅增强了应用的视觉效果&#xff0c;也使得用户交互更为直观和流畅…

MySQL数据库:SQL语言入门 【2】(学习笔记)

目录 2&#xff0c;DML —— 数据操作语言&#xff08;Data Manipulation Language&#xff09; &#xff08;1&#xff09;insert 增加 数据 &#xff08;2&#xff09;delete 删除 数据 truncate 删除表和数据&#xff0c;再创建一个新表 &#xff08;3&#xf…

“南海明珠”-黄岩岛(民主礁)领海基线WebGIS绘制实战

目录 前言 一、关于岛屿的基点位置 1、领海基点 二、基点坐标的转换 1、最底层的左边转换 2、单个经纬度坐标点转换 3、完整的转换 三、基于天地图进行WebGIS展示 1、领海基点的可视化 2、重要城市距离计算 四、总结 前言 南海明珠黄岩岛&#xff0c;这座位于南海的…

19.UE5道具掉落

2-21 道具掉落&#xff0c;回血、回蓝、升级提升伤害_哔哩哔哩_bilibili 目录 1.道具的创建&#xff0c;道具功能的实现 2.随机掉落 1.道具的创建&#xff0c;道具功能的实现 新建Actor蓝图&#xff0c;并命名为道具总类&#xff0c;添加一个Niagara粒子组件和一个碰撞箱bo…

Cartographer激光雷达slam -20241116

Cartographer Cartographer代码结构 cartographer&#xff1a;负责处理来自雷达、IMU和里程计的数据并基于这些数据进行地图的构建&#xff0c;是cartographer理论的底层实现cartographer_ros&#xff1a;基于ros的通信机制获取传感器的数据并将它们转换成cartographer中定义…

node.js学习笔记-Window下MongoDB数据库安装(二)

一、介绍 MongoDB 是一个基于分布式文件存储的开源数据库系统&#xff0c;在当前的软件开发和数据存储领域中应用广泛&#xff0c;以下是对 MongoDB 的详细介绍&#xff1a; 文档型数据库&#xff1a;MongoDB 以 BSON&#xff08;Binary JSON&#xff09;格式存储数据&#x…

STM32G4的数模转换器(DAC)的应用

目录 概述 1 DAC模块介绍 2 STM32Cube配置参数 2.1 参数配置 2.2 项目架构 3 代码实现 3.1 接口函数 3.2 功能函数 3.3 波形源代码 4 DAC功能测试 4.1 测试方法介绍 4.2 波形测试 概述 本文主要介绍如何使用STM32G4的DAC模块功能&#xff0c;笔者使用STM32Cube工具…

【论文复现】轻松利用自适应特征融合实现去雾

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀ 智慧医疗 介绍创新点网络结构特征提取阶段自适应融合阶段图像重建阶段上下文增强模块CEM特征融合模块AFM 结果分析 提示 论文题目&#xff1…

常用在汽车PKE无钥匙进入系统的高度集成SOC芯片:CSM2433

CSM2433是一款集成2.4GHz频段发射器、125KHz接收器和8位RISC&#xff08;精简指令集&#xff09;MCU的SOC芯片&#xff0c;用在汽车PKE无钥匙进入系统里。 什么是汽车PKE无钥匙进入系统&#xff1f; 无钥匙进入系统具有无钥匙进入并且启动的功能&#xff0c;英文名称是PKE&…

《TCP/IP网络编程》学习笔记 | Chapter 11:进程间通信

《TCP/IP网络编程》学习笔记 | Chapter 11&#xff1a;进程间通信 《TCP/IP网络编程》学习笔记 | Chapter 11&#xff1a;进程间通信进程间通信的基本概念通过管道实现进程间通信通过管道进行进程间双向通信 运用进程间通信习题&#xff08;1&#xff09;什么是进程间通信&…

计算机网络各层设备总结归纳(更新ing)

计算机网络按照OSI&#xff08;开放式系统互联&#xff09;模型分为七层&#xff0c;每一层都有其特定的功能和对应的网络设备。以下是各层对应的设备&#xff1a; 1. 物理层&#xff08;Physical Layer) 设备&#xff1a;中继器&#xff08;Repeater&#xff09;、集线器…

在kile 5中一个新工程的创建

这两天博主学习到了在kile5中创建一个工程&#xff0c;当然博主不会忘了小伙伴们的&#xff0c;这就和你们分享。 本次创建以STM32F103C8为例 创建过程&#xff1a; 1首先创建文件 名字随意&#xff0c;但也不要太随意&#xff0c;因为是外国软件&#xff0c;所以多少对中文…

AI写作(十)发展趋势与展望(10/10)

一、AI 写作的崛起之势 在当今科技飞速发展的时代&#xff0c;AI 写作如同一颗耀眼的新星&#xff0c;迅速崛起并在多个领域展现出强大的力量。 随着人工智能技术的不断进步&#xff0c;AI 写作在内容创作领域发挥着越来越重要的作用。据统计&#xff0c;目前已有众多企业开始…

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

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

大数据技术之Hive:还是SQL好用

虽说 MapReduce 简化了大数据编程的难度&#xff0c;但是如果每来一个需求都要写一个 MapReduce 代码&#xff0c;那岂不是太麻烦了。尤其是在全民“CRM”的2000年代&#xff0c;对于像数据分析师已经习惯使用SQL进行分析和统计的工程师&#xff0c;让他们去 MapReduce 编程还是…

使用 Grafana api 查询 Datasource 数据

一、使用grafana 的api 接口 官方API 二、生成Api key 点击 Administration -》Users and accss -》Service accounts 进入页面 点击Add service account 创建 service account 点击Add service account token 点击 Generate token , 就可以生成 api key 了 三、进入grafana…