Namespace 

1.Namespace 概念

Namespace 是 Linux 内核级资源隔离技术,把系统资源封装隔离,让不同进程拥有独立的一套系统资源视图,是容器实现隔离的基础。

Linux 有 7 种命名空间:

  • cgroup ns:隔离 Cgroup 视图
  • ipc ns:隔离进程间通信资源
  • mnt ns:隔离文件系统挂载点
  • net ns:隔离网络资源
  • pid ns:隔离进程 PID 编号
  • user ns:隔离用户、用户组 ID
  • uts ns:隔离主机名、域名

2. 实验对比:chroot vs Namespace

  1. chroot 实验

使用docker export导出容器 rootfs,通过chroot切换根目录。

  • chroot 仅仅改变进程看到的文件根目录。
  • 没有网络、PID 进程、用户等内核资源隔离,仍然可以看到宿主机全部网络、全部进程,单独 chroot 不等于容器。
  1. unshare 创建 Namespace

unshare命令可以创建一组全新命名空间,启动 shell,实现资源隔离。

  • pid ns:新命名空间内部 PID 从 1 开始;同一个进程,在宿主机和容器内 PID 编号不一样。
  • pid 命名空间生效后,还需要把proc文件系统重新挂载到新环境,ps命令才能只看到容器内部进程。
  • net ns:隔离网络栈,需要手动创建 veth 虚拟网卡,把网卡移入 net 命名空间,容器内部才拥有独立网络设备。

3. 核心结论

  1. chroot 只隔离文件视角,不能隔离进程、网络、用户。
  2. Namespace 才完成内核层面各类资源隔离;Docker 底层就是封装调用这一套内核能力。
  3. 每种 Namespace 负责一类资源隔离;PID 命名空间会改变进程 PID;网络命名空间需要配套虚拟网卡设备才能拥有独立网络。
  4. 仅仅 Namespace 还不够,还需要 Cgroups 做资源限制、rootfs 文件系统,三者一起才构成完整容器。

简单一句话:chroot 改文件根目录;Namespace 做内核资源隔离;unshare 是手动创建 namespace 的工具,Docker 自动帮我们完成这套操作。

更多推荐