`
maosheng
  • 浏览: 565916 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

容器技术的基石: cgroup、namespace和联合文件系统

 
阅读更多
Docker 是基于 Linux Kernel 的 Namespace 、 Cgroups 和 联合文件系统实现的技术实现的。

Docker 是利用 Linux 的 Namespace 、Cgroups 和 联合文件系统三大机制来保证实现的, 所以它的原理是使用 Namespace 做主机名、网络、PID 等资源的隔离,使用 Cgroups 对进程或者进程组做资源(例如:CPU、内存等)的限制,联合文件系统用于镜像构建和容器运行环境。

一、Namespace:

Namespace 是 Linux 内核的一项功能,该功能对内核资源进行分区,以使一组进程看到一组资源,而另一组进程看到另一组资源。Namespace 的工作方式通过为一组资源和进程设置相同的 Namespace 而起作用,但是这些 Namespace 引用了不同的资源。这些资源可以是进程 ID、主机名、用户 ID、文件名、与网络访问相关的名称和进程间通信。

简单来说,Namespace 是 Linux 内核的一个特性,该特性可以实现在同一主机系统中,对进程 ID、主机名、用户 ID、文件名、网络和进程间通信等资源的隔离。Docker 利用 Linux 内核的 Namespace 特性,实现了每个容器的资源相互隔离,从而保证容器内部只能访问到自己 Namespace 的资源。

最新的 Linux 5.6 内核中提供了 8 种类型的 Namespace:

Namespace 名称                         作用                           内核版本
Mount(mnt)                         隔离挂载点                     2.4.19
Process ID (pid)                   隔离进程 ID                     2.6.24
Network (net)                         隔离网络设备,端口号等             2.6.29
Interprocess Communication (ipc) 隔离 System V IPC 和 POSIX message queues 2.6.19
UTS Namespace(uts)                 隔离主机名和域名             2.6.19
User Namespace (user)                 隔离用户和用户组                3.8
Control group (cgroup) Namespace 隔离 Cgroups 根目录                4.6
Time Namespace                         隔离系统时间                        5.6


Linux 内核提供了8种 Namespace,但是最新版本的 Docker 只使用了其中的前6 种,分别为Mount Namespace、PID Namespace、Net Namespace、IPC Namespace、UTS Namespace、User Namespace。

Mount Namespace 是 Linux 内核实现的第一个 Namespace,从内核的 2.4.19 版本开始加入。它可以用来隔离不同的进程或进程组看到的挂载点。通俗地说,就是可以实现在不同的进程中看到不同的挂载目录。使用 Mount Namespace 可以实现容器内只能看到自己的挂载信息,在容器内的挂载操作不会影响主机的挂载目录。

PID Namespace 的作用是用来隔离进程。在不同的 PID Namespace 中,进程可以拥有相同的 PID 号,利用 PID Namespace 可以实现每个容器的主进程为 1 号进程,而容器内的进程在主机上却拥有不同的PID。例如一个进程在主机上 PID 为 122,使用 PID Namespace 可以实现该进程在容器内看到的 PID 为 1。

UTS Namespace 主要是用来隔离主机名的,它允许每个 UTS Namespace 拥有一个独立的主机名。例如我们的主机名称为 docker,使用 UTS Namespace 可以实现在容器内的主机名称为 lagoudocker 或者其他任意自定义主机名。

IPC Namespace 主要是用来隔离进程间通信的。例如 PID Namespace 和 IPC Namespace 一起使用可以实现同一 IPC Namespace 内的进程彼此可以通信,不同 IPC Namespace 的进程却不能通信。

User Namespace 主要是用来隔离用户和用户组的。一个比较典型的应用场景就是在主机上以非 root 用户运行的进程可以在一个单独的 User Namespace 中映射成 root 用户。使用 User Namespace 可以实现进程在容器内拥有 root 权限,而在主机上却只是普通用户。

Net Namespace 是用来隔离网络设备、IP 地址和端口等信息的。Net Namespace 可以让每个进程拥有自己独立的 IP 地址,端口和网卡信息。例如主机 IP 地址为 172.16.4.1 ,容器内可以设置独立的 IP 地址为 192.168.1.1。

当 Docker 新建一个容器时, 它会创建这六种 Namespace,然后将容器中的进程加入这些 Namespace 之中,使得 Docker 容器中的进程只能看到当前 Namespace 中的系统资源。

正是由于 Docker 使用了 Linux 的这些 Namespace 技术,才实现了 Docker 容器的隔离,可以说没有 Namespace,就没有 Docker 容器。

Docker 正是结合了这六种 Namespace 的功能,才诞生了 Docker 容器。

二、Cgroups:

Cgroups(全称:control groups)是 Linux 内核的一个功能,它可以实现限制和隔离进程或者进程组的资源(如 CPU、内存、磁盘 IO 等)

Docker 是基于 Linux 内核的 Namespace 技术实现资源隔离的,所有的容器都共享主机的内核

cgroups 主要提供了如下功能。

1、资源限制: 限制资源的使用量,例如我们可以通过限制某个业务的内存上限,从而保护主机其他业务的安全运行。

2、优先级控制:不同的组可以有不同的资源( CPU 、磁盘 IO 等)使用优先级。

3、审计:计算控制组的资源使用情况。

4、控制:控制进程的挂起或恢复。

cgroups功能的实现依赖于三个核心概念:子系统、控制组、层级树。

子系统(subsystem):是一个内核的组件,一个子系统代表一类资源调度控制器。例如内存子系统可以限制内存的使用量,CPU 子系统可以限制 CPU 的使用时间。

控制组(cgroup):表示一组进程和一组带有参数的子系统的关联关系。例如,一个进程使用了 CPU 子系统来限制 CPU 的使用时间,则这个进程和 CPU 子系统的关联关系称为控制组。

层级树(hierarchy):是由一系列的控制组按照树状结构排列组成的。这种排列方式可以使得控制组拥有父子关系,子控制组默认拥有父控制组的属性,也就是子控制组会继承于父控制组。比如,系统中定义了一个控制组 c1,限制了 CPU 可以使用 1 核,然后另外一个控制组 c2 想实现既限制 CPU 使用 1 核,同时限制内存使用 2G,那么 c2 就可以直接继承 c1,无须重复定义 CPU 限制。

cgroups 的三个核心概念中,子系统是最核心的概念,因为子系统是真正实现某类资源的限制的基础。

cgroups 不仅可以实现资源的限制,还可以为我们统计资源的使用情况,容器监控系统的数据来源也是 cgroups 提供的。


三、联合文件系统:

联合文件系统,又叫 UnionFS,是一种通过创建文件层进程操作的文件系统,因此,联合文件系统非常轻快。Docker 使用联合文件系统为容器提供构建层,使得容器可以实现写时复制以及镜像的分层构建和存储。常用的联合文件系统有 AUFS、Overlay 和 Devicemapper 等.











分享到:
评论

相关推荐

    李泽帆:Cgroup的过去、现状和开发计划

    cgroups的使用涉及到层次结构,创建和使用cgroup的步骤包括挂载cgroup文件系统(cgroupfs)、创建cgroup目录、配置cgroup、将进程添加到cgroup以及运行和删除cgroup。用户态接口提供了与cgroups交互的工具和方法。 ...

    Linux Cgroup 技术 与 智能手机系统 IO 优化

    4. 进程组隔离(Isolation):使用ns子系统使不同进程组使用不同的命名空间,以隔离进程、网络、文件系统等资源。 5. 进程组控制(Control):利用freezer子系统实现进程组的挂起和恢复。 Cgroups的基本概念包括...

    容器技术之PPT教案.pptx

    容器技术是指在操作系统层面上对应用程序进行隔离和资源限制的一种技术。这种技术可以使得多个应用程序在同一个操作系统上运行,而不需要使用虚拟机技术。容器技术可以提供轻量级的虚拟化解决方案,提高服务器的利用...

    Docker底层技术Namespace Cgroup应用详解

    有两个伪文件系统:/proc和/sys/ UTS:允许每个container拥有独立的hostname(主机名)和domainname(域名),使其在网络上可以被视作一个独立的节点而非Host上的一个进程。 IPC:contaner中进程交互还是采用linux...

    容器技术之Docker介绍.pptx

    Namespace和Cgroup ---------------- Namespace是容器技术中的一种关键技术,它提供了程序运行环境的隔离。Namespace可以将内核中的全局变量改为per-namespace变量,从而实现程序的隔离。 Cgroup(Control Group)...

    docker容器入门与实践期末考试总复习.docx

    在本节总结中,我们将详细介绍 Docker 容器技术的基本概念、优点、架构、Namespace 和 Cgroup 等关键技术点,并总结 Docker 容器技术在实际应用中的价值。 容器技术解决了环境依赖问题,实现了跨平台分发使用。...

    云计算:3、轻量级虚拟化-容器技术.ppt

    容器技术的核心技术包括Namespace、Cgroup和AUFS文件系统。其中,Namespace提供了一种隔离机制,Cgroup提供了一种资源限额功能,而AUFS文件系统支持写时复制特性。 在容器技术中,Docker是一个非常重要的实现,它...

    云化架构的创新实践(阿里技术专场)——Pouch和阿里容器技术演讲 共26页.pdf

    - **进程与文件系统隔离**:通过pid namespace和chroot技术实现进程与文件系统的隔离。 - **磁盘空间与网络带宽隔离**:使用dirquota和飞天的netqos模块实现磁盘空间和网络带宽的隔离。 ##### 3. Pouch与Docker的...

    2015 Container技术峰会-容器核心技术剖析-田琪

    京东资深架构师田琪在OpenCloud 2015大会Container专场的演讲PPT:容器核心技术剖析,主要涉及容器整体生态系统架构,容器底层核心技术如:cgroup,namespace,devicemapper等内核机制原理与实现,docker上层对其如何...

    Performance - cgroup介绍

    cgroup 名词是 Linux 下一种将进程按组管理的机制,在用户层面看,cgroup 技术就是可以把系统中的所有进程组织成一颗独立的树,每颗树都包含系统所有进程,树的每个节点就是一个进程组,而每颗树又和一个或者多个 ...

    Docker系统容器架构介绍.pptx

    lxcfs 是一种文件系统,用于提供容器内的文件系统,cgroup 是一种Linux内核机制,用于控制容器的资源使用。 九、Kernel 和 Cgroup namespace Kernel 是 Linux 内核,Cgroup namespace 是一种机制,用于控制容器的...

    cgroupv2.js:cgroup v2 Node.js绑定

    控制组提供了文件系统API(cgroupfs),以便用户可以通过文件读写操作来管理cgroup。 该Node.js绑定仅使用fs/promises模块中的readFile和writeFile函数。 为什么要使用异步API? 由于cgroupfs不是磁盘上的文件系统...

    容器基础技术介绍与实践.pdf

    3. **Mount Namespace**:隔离挂载点,使得每个容器可以有自己的文件系统视图,不会影响其他容器。 4. **User Namespace**:隔离用户ID和组ID,以及相应的权限,保证安全性和隔离性。 5. **Network Namespace**:...

    从虚拟化到云原生——容器技术的发展史.pdf

    Docker的崛起为容器技术带来了革命性的变革,它利用Linux内核的Namespace和Cgroup功能,实现了资源的隔离和限制,进一步推动了容器技术的普及。 与传统虚拟机相比,容器技术具有以下特点: - 资源占用小:容器不...

    第29讲 容器网络:来去自由的日子,不买公寓去合租1

    相比虚拟机,容器更像“合租”而非“买公寓”,它共享宿主机的操作系统内核,但通过namespace和cgroup技术实现资源隔离。 【命名空间(namespace)】是Linux内核提供的一种机制,它允许在同一台主机上创建多个独立的...

    容器底层实现技术实验手册1

    《容器底层实现技术实验手册1》是一份详细指导如何利用Namespace和Cgroups进行资源限制的实践手册,主要针对Docker容器技术。以下是手册中的关键知识点: 1. **Namespace**: Namespace是Linux内核提供的一种隔离...

    cgroup原理和实现

    cgroup原理和实现,Cgroups 是 control groups 的缩写,是 Linux 内核提供的一种可以限制、记录、隔离进程组 (process groups)所使用的物理资源(如:cpu,memory,IO 等等)的机制。最初由 google 的 工程师提出,后来被...

Global site tag (gtag.js) - Google Analytics