Linux Namespace:轻量级虚拟化技术简介

Linux Namespace:轻量级虚拟化技术简介

当我们谈论虚拟化技术时,可能首先想到的是像 VMware 或 VirtualBox 这样的全虚拟化解决方案,或者是像 Xen 或 KVM 这样的硬件辅助虚拟化技术。然而,Linux 系统中内置了一种轻量级的虚拟化技术,那就是 Linux Namespace。

1. 什么是 Linux Namespace?

Linux Namespace 是内核的一个特性,它可以隔离一部分系统资源,使得一个进程及其子进程在 Namespace 内部有一个独立的全局视图,看到的资源与外部系统的全局资源是隔离的。这使得在 Namespace 内的进程能够运行在一个被隔离和安全的环境中,就像在一个独立的系统中一样。

2. Linux Namespace 的类型

Linux 支持以下七种类型的 Namespace:

PID Namespace:

隔离进程 ID,每个 Namespace 内部的进程都有一个独立的 PID 空间,即使在不同的 Namespace 中,进程 ID 可能是相同的,但它们是完全不同的进程。

对于进程命名空间(PID Namespace),Docker 容器有自己独立的命名空间,但是这些进程实际上还是在宿主机上运行的。所以,你可以在宿主机上使用 ps aux 看到容器中的进程,尽管这些进程在容器内部有自己的 PID。

Mount Namespace:

隔离文件系统挂载点,每个 Namespace 都有自己独立的文件系统视图,一个 Namespace 中的挂载或卸载操作不会影响其他 Namespace。

对于挂载点命名空间(Mount Namespace),每个 Docker 容器都有自己的命名空间,这些命名空间与宿主机完全隔离。因此,当你在宿主机上运行 mount 命令,你无法看到容器内的挂载点。这是为了保护容器的文件系统隔离性,防止容器能够影响到宿主机的文件系统。

如果你想查看 Docker 容器内的挂载点,你需要进入容器内部,然后在容器内运行 mount 命令。你可以使用 docker exec 或 docker attach 命令来进入一个正在运行的容器。例如:

bash 复制代码
docker exec -it <container_id> /bin/bash

然后在容器内部运行 mount 命令:

bash 复制代码
mount

这样,你就可以看到容器内的挂载点了。

Network Namespace:

隔离网络设备,IP 地址,IP 路由表,/proc/net 目录,IP 配置参数等。

User Namespace:

隔离用户和用户组 ID,每个 Namespace 都有自己的用户和用户组 ID 空间,User Namespace 允许将一个普通用户映射为 Namespace 内的 root 用户。

IPC Namespace:

隔离 System V IPC 和 POSIX 消息队列,每个 Namespace 都有自己的 IPC 资源。

UTS Namespace:

隔离主机名和域名,每个 Namespace 都可以有自己的主机名和 NIS 域名。

Cgroup Namespace:

隔离 cgroup 根目录视点,使得每个 Namespace 都有自己的 cgroup 视图。

3. Linux Namespace 的应用

Linux Namespace 是许多现代容器技术(例如 Docker、LXC)的基础。容器技术通过使用 Linux Namespace,可以为容器内的应用程序提供一个隔离的运行环境,每个容器内的应用程序都认为自己独占了一个系统。

例如,通过使用 PID Namespace,我们可以为每个容器分配独立的 PID 空间,使得容器内的进程无法看到容器外的进程。通过使用 Network Namespace,我们可以为每个容器分配独立的网络栈,使得容器内的应用程序可以有自己独立的网络设备和 IP 地址。这意味着我们可以在容器中运行网络服务,而不用担心端口冲突问题。

4. 总结

Linux Namespace 是一种强大而灵活的轻量级虚拟化技术,它使得我们可以在同一台机器上运行多个隔离的进程或应用程序,而无需额外的虚拟化开销。Linux Namespace 的出现,极大地推动了容器技术的发展,对于提高系统的资源利用率,提供安全的应用程序运行环境都有重要的作用。

为什么Winodws和Mac的容器能力一直很弱,因为容器技术依赖的实际上是Linux的cgroup和namespace两大核心机制,当前winodws、mac运行的容器仍然是通过类似虚拟机的方案来运行的容器。windows server虽然推出了自己的容器技术,但是仍然不够成熟和稳定。理解namespace的作用是我们理解容器技术的一大关键。

相关推荐
Lary_Rock13 分钟前
Android 编译问题 prebuilts/clang/host/linux-x86
android·linux·运维
熬夜学编程的小王14 分钟前
【Linux篇】理解信号:如何通过信号让程序听从操作系统的指令
linux·信号产生·软件条件产生信号
绵绵细雨中的乡音26 分钟前
Linux进程学习【基本认知】
linux·运维·学习
Johny_Zhao44 分钟前
MySQL 高可用集群搭建部署
linux·人工智能·mysql·信息安全·云计算·shell·yum源·系统运维·itsm
珹洺2 小时前
Linux操作系统从入门到实战(三)Linux基础指令(上)
linux·运维·服务器
再睡一夏就好2 小时前
Linux常见工具如yum、vim、gcc、gdb的基本使用,以及编译过程和动静态链接的区别
linux·服务器·c语言·c++·笔记
剁椒排骨2 小时前
win11什么都不动之后一段时间黑屏桌面无法显示,但鼠标仍可移动,得要熄屏之后才能进入的四种解决方法
运维·windows·经验分享·计算机外设·win11·win10
angushine2 小时前
让Docker端口映射受Firewall管理而非iptables
运维·docker·容器
归寻太乙2 小时前
Linux环境变量
linux·运维·服务器
m0Java门徒2 小时前
面向对象编程核心:封装、继承、多态与 static 关键字深度解析
java·运维·开发语言·intellij-idea·idea