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

【Docker基础】Docker核心概念:命名空间(Namespace)详解

目录

1 引言:为什么需要Namespace?

2 Namespace的核心概念

2.1 什么是Namespace?

2.2 Docker使用的6种Namespace

3 Namespace的底层原理

3.1 Namespace创建流程

3.2 查看进程的Namespace

4 各Namespace详解

4.1 PID Namespace

4.2 Network Namespace

4.3 Mount Namespace

4.4 User Namespace

5 Namespace的局限性

6 总结

附录:常用命令速查


1 引言:为什么需要Namespace?

在传统的Linux系统中,所有进程共享相同的全局资源(如进程ID、网络接口、文件系统挂载点等),这种设计会导致 资源冲突安全问题,例如:
  • 两个进程可能使用相同的PID(进程ID),导致管理混乱
  • 普通用户可能看到其他用户的进程或网络配置,存在信息泄露风险
Docker通过Namespace技术实现资源隔离,使得每个容器拥有独立的系统视图,仿佛运行在单独的Linux主机上。

2 Namespace的核心概念

2.1 什么是Namespace?

Namespace是Linux内核的一项功能,用于 隔离系统资源,使得不同Namespace中的进程拥有独立的:
  • 进程树(PID Namespace)
  • 网络接口(Network Namespace)
  • 文件系统挂载点(Mount Namespace)
  • 用户和用户组(User Namespace)

2.2 Docker使用的6种Namespace

Namespace类型

作用

Docker中的应用场景

PID

隔离进程ID

容器内进程无法看到宿主机或其他容器的进程

Network

隔离网络设备、IP、端口

每个容器拥有独立的网络栈(如docker0)

Mount

隔离文件系统挂载点

容器内只能看到自己的文件系统

UTS

隔离主机名和域名

容器可以设置自己的hostname

IPC

隔离进程间通信(如信号量、共享内存)

避免容器间通信干扰

User

隔离用户和用户组

容器内可以映射不同的UID/GID

3 Namespace的底层原理

3.1 Namespace创建流程

  • clone()系统调用:Docker通过clone()(而非fork())创建新进程,并传入CLONE_NEW*标志(如CLONE_NEWPID)
  • 内核分配新Namespace:Linux内核为进程分配独立的资源视图
  • 容器进程运行在隔离环境:进程只能看到当前Namespace内的资源

3.2 查看进程的Namespace

  • 每个进程的Namespace信息存储在/proc//ns/目录下:
# 查看Docker容器的Namespace
docker inspect <container_id> --format '{{.State.Pid}}'  # 获取容器PID
ls -l /proc/<pid>/ns/  # 查看Namespace文件描述符

4 各Namespace详解

4.1 PID Namespace

  • 作用:隔离进程ID,使容器内进程的PID从1开始计数
  • 验证方法
# 在容器内运行
docker run -it my-app sh
ps aux  # 只能看到容器内的进程(PID 1通常是sh或init进程)
  • 宿主机可以通过nsenter进入容器的PID Namespace:
nsenter --target <pid> --pid 
# 进入容器的进程空间

4.2 Network Namespace

  • 作用:隔离网络设备、IP地址、路由表等
  • Docker网络模型
  • 相关命令
# 查看容器的Network Namespace 
ip netns list # 需先创建符号链接 
docker exec <container_id> ip addr # 查看容器内网络配置

4.3 Mount Namespace

  • 作用:隔离文件系统挂载点,使容器拥有独立的/目录
  • 示例
# 在容器内挂载临时文件系统
docker run -it --rm my-app sh
mount -t tmpfs tmpfs /mnt  # 仅影响当前容器

4.4 User Namespace

  • 作用:映射容器内外的UID/GID,提升安全性(如容器内root≠宿主机root)
  • 启用方法
docker run -it --userns-remap=default my-app sh
id  # 显示uid=0(root),但宿主机实际为非root用户

5 Namespace的局限性

  • 内核共享:所有容器共用宿主机内核,无法运行不同内核版本的应用
  • 性能开销:Namespace和Cgroups会引入少量性能损耗
  • 特权容器风险:--privileged模式会绕过部分隔离

6 总结

Namespace是Docker资源隔离的核心技术,涵盖PID、网络、文件系统等

附录:常用命令速查

# 查看系统支持的Namespace
ls /proc/$$/ns/# 进入容器的Namespace
nsenter --target <pid> --mount --net --pid# 查看所有Namespace
lsns -p <pid>
http://www.xdnf.cn/news/14065.html

相关文章:

  • C++11 Generalized(non-trivial) Unions:从入门到精通
  • LINUX613计划测put
  • Hadoop 003 — JAVA操作MapReduce入门案例
  • 传统数据仓库正在被 Agentic AI 吞噬?Agentic Data Stack 初探
  • 代码训练LeetCode(33)字符串首次匹配
  • 基于Cesium的Shadertoy纹理材质应用
  • 如何从 Windows 11 或 10 远程访问 Ubuntu 24.04 或 22.04 桌面
  • Java过滤器的基本概念
  • 微软Copilot两大创新功能详解:SharePoint Agents vs. Copilot Notebooks
  • Git更新master分支完整指南:从拉取到推送的全流程
  • 【搜狗输入法】如何使用自定义标点设置来输出直角引号
  • Keil无法下载程序到STM32 Error: Flash Download failed - Target DLL has been cancelled
  • 实现无缝连接:EtherNet/IP转CANopen网关助力汽车制造智能化未来
  • 串口输出版UART接收中断程序 (8259端口400H/402H)
  • 【51单片机】7. 串口通信、单片机向电脑发送数据电脑发送数据点亮LED灯Demo
  • 【SAS逐步回归法】REG过程逐步回归求解最优方程
  • 准确---配置全局代理
  • SpringBoot框架与应用与面向切面编程
  • sdl3+imgui+implot高效绘制图表(c++)
  • RAG 技术详解:结合检索与生成的智能问答新范式
  • c++ io操作(文件的读取与写入)
  • ES集群的故障转移
  • 中科微ATR2660S低噪声放大器芯片
  • IGBT开通时间、关断时间、死区时间
  • 楼宇自控新方向:电力载波技术——低成本、高兼容性的智能未来
  • day28-shell编程-2
  • 动态规划-最长子序列
  • 低熔点纤维市场深度解析:技术革新与产业应用前景
  • 英语写作核心词汇
  • NVIDIA Isaac GR00T N1.5 适用于 LeRobot SO-101 机械臂