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

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


http://www.kler.cn/a/397626.html

相关文章:

  • mysql数据迁移PolarDB
  • 动态规划-完全背包问题——518.零钱兑换II
  • SpringBoot3全面复习
  • 插入排序——希尔排序
  • 黑马嵌入式开发入门模电基础学习笔记
  • 七:如何用Chrome的Network面板分析HTTP报文
  • char* 指针转换与打印
  • 【MySQL】MySQL中的函数之JSON_REPLACE
  • Jmeter中的监听器(四)
  • 电动机三角型与星型的区别和接线方法图解
  • 新手小白学习docker第七弹------安装redis集群大厂面试
  • 从H3C和Dell官网下载OEM版VMware Esxi镜像攻略
  • 大数据技术之HBase中的HRegion
  • UAV-VisLoc:中国11地大规模无人机视觉定位数据集
  • Vulnhub靶场 Billu_b0x 练习
  • LeetCode77:组合
  • python常见的后缀文件
  • 【高等数学学习记录】函数的求导法则
  • C++初阶——优先队列
  • 分布式微服务项目,同一个controller不同方法间的转发导致cookie丢失,报错null pointer异常
  • 122、java的LambdaQueryWapper的条件拼接实现数据sql中and (column1 =1 or column1 is null)
  • 向潜在安全信息和事件管理 SIEM 提供商提出的六个问题
  • 深入解析 Linux 文件权限
  • MFC 鼠标悬停在控件上,显示提示信息
  • TCP(下):三次握手四次挥手 动态控制
  • Docker compose部署Activemq