Docker底层基石namespace与cgroup

容器本质上是把系统中为同一个业务目标服务的相关进程合成一组,放在一个叫做namespace的空间中,同一个namespace中的进程能够互相通信,但看不见其他namespace中的进程。每个namespace可以拥有自己独立的主机名、进程ID系统、IPC、网络、文件系统、用户等等资源。在某种程度上,实现了一个简单的虚拟:让一个主机上可以同时运行多个互不感知的系统。

此外,为了限制namespace对物理资源的使用,对进程能使用的CPU、内存等资源需要做一定的限制。这就是Cgroup技术,Cgroup是Control group的意思。比如我们常说的4c4g的容器,实际上是限制这个容器namespace中所用的进程,最多能够使用4核的计算资源和4GB的内存。
简而言之,Linux内核提供namespace完成隔离,Cgroup完成资源限制。namespace+Cgroup构成了容器的底层技术(rootfs是容器文件系统层技术)。

namespace

一个namespace把一些全局系统资源封装成一个抽象体,该抽象体对于本namespace中的进程来说有它们自己的隔离的全局资源实例。改变这些全局资源对于该namespace中的进程是可见的,而对其他进程来说是不可见的。
Linux 提供一下几种 namespaces:

  Namespace   Constant                           Isolates
  -  IPC            CLONE_NEWIPC            System V IPC, POSIX message queues
  -  Network     CLONE_NEWNET           Network devices, stacks, ports, etc.
  -  Mount        CLONE_NEWNS             Mount points
  -  PID            CLONE_NEWPID            Process IDs
  -  User          CLONE_NEWUSER         User and group IDs
  -  UTS          CLONE_NEWUTS           Hostname and NIS domain name
  

为了在分布式的环境下进行通信和定位,容器必然需要一个独立的IP、端口、路由等等,自然就想到了网络的隔离。同时,你的容器还需要一个独立的主机名以便在网络中标识自己。想到网络,顺其自然就想到通信,也就想到了进程间通信的隔离。可能你也想到了权限的问题,对用户和用户组的隔离就实现了用户权限的隔离。最后,运行在容器中的应用需要有自己的PID,自然也需要与宿主机中的PID进行隔离。

cgroups

Cgroups是control groups的缩写,最初由google的工程师提出,后来被整合进Linux内核。Cgroups是Linux内核提供的一种可以限制、记录、隔离进程组(process groups)所使用的物理资源(如:CPU、内存、IO等)的机制。对开发者来说,cgroups 有如下四个有趣的特点:

  • cgroups 的 API 以一个伪文件系统的方式实现,即用户可以通过文件操作实现 cgroups 的组织管理。
  • cgroups 的组织管理操作单元可以细粒度到线程级别,用户态代码也可以针对系统分配的资源创建和销毁 cgroups,从而实现资源再分配和管理。
  • 所有资源管理的功能都以“subsystem(子系统)”的方式实现,接口统一。
  • 子进程创建之初与其父进程处于同一个 cgroups 的控制组。

本质上来说,cgroups 是内核附加在程序上的一系列钩子(hooks),通过程序运行时对资源的调度触发相应的钩子以达到资源追踪和限制的目的。实现 cgroups 的主要目的是为不同用户层面的资源管理,提供一个统一化的接口。从单个进程的资源控制到操作系统层面的虚拟化。Cgroups 提供了以下四大功能:

  • 资源限制(Resource Limitation):cgroups 可以对进程组使用的资源总额进行限制。如设定应用运行时使用内存的上限,一旦超过这个配额就发出 OOM(Out of Memory)。
  • 优先级分配(Prioritization):通过分配的 CPU 时间片数量及硬盘 IO 带宽大小,实际上就相当于控制了进程运行的优先级。
  • 资源统计(Accounting): cgroups 可以统计系统的资源使用量,如 CPU 使用时长、内存用量等等,这个功能非常适用于计费。
  • 进程控制(Control):cgroups 可以对进程组执行挂起、恢复等操作。
    Docker正是使用cgroup进行资源划分,每个容器都作为一个进程运行起来,每个业务容器都会有一个基础的pause容器也就是POD作为基础容器。pause容器提供了划分namespace的内容,并连通同一POD下的所有容器,共享网络资源。查看容器的PID,对应/proc/pid/下是该容器的运行资源。

原文地址:https://www.cnblogs.com/ExMan/p/12053681.html

时间: 2024-11-08 16:10:30

Docker底层基石namespace与cgroup的相关文章

Docker底层技术Namespace & Cgroup应用

Docker底层技术: docker底层的2个核心技术分别是Namespaces和Control groupsNamespace:是容器虚拟化的核心技术,用来隔离各个容器,可解决容器之间的冲突. 主要通过以下六项隔离技术来实现:有两个伪文件系统:/proc和/sys/ UTS:允许每个container拥有独立的hostname(主机名)和domainname(域名),使其在网络上可以被视作一个独立的节点而非Host上的一个进程. IPC:contaner中进程交互还是采用linux常见的进程间

畅谈Docker底层技术-LXC与Cgroup

#Docker LXC及Cgroup    docker最为为LXC+AUFS组合,其中LXC负责资源管理,AUFS负责镜像管理:而LXC包括cgroup,namespace,chroot等组件 并通过cgroup资源管理     那么,从资源管理的角度来看,Docker,Lxc,Cgroup三者的关系是怎样的呢? cgroup是在底层落实资源管理,LXC在cgroup上面封装了一层,随后,docker有在LXC封装了一层:    Cgroup其实就是linux提供的一种限制,记录,隔离进程组所

Docker之NameSpace与Cgroup

Docker容器技术是一个与传统的虚拟化技术有些本质上的差别,传统的虚拟化技术,是站硬件物理资源的基础上,虚拟出多个OS,然后在OS的基础上构建相对独立的程序运行环境,而Docker则是在OS的基础上进行虚拟,所以,Docker轻量很多,因此其资源占用.性能消耗相比传统虚拟化都有很大的优势. docker容器很快,启动和停止可以在秒级实现,比传统的虚拟化技术要快很多,docker核心解决的问题是利用容器来实现类似VM的功能,从而节省更多的硬件资源,docker容器除了运行其中的应用之外,基本不消

[转帖]linux namespace 和cgroup lxc

https://blog.csdn.net/xiaoliuliu2050/article/details/53443863 5.1 linux namespace 和cgroup lxc 2016年12月03日 12:53:32 阅读数:2065 Namespace:隔离技术的第一层,确保 Docker 容器内的进程看不到也影响不到 Docker 外部的进程. Control Groups:LXC 技术的关键组件,用于进行运行时的资源限制. UnionFS(文件系统):容器的构件块,创建抽象层,

理解Docker(3):Docker 使用 Linux namespace 隔离容器的运行环境

1. 基础知识:Linux namespace 的概念 Linux 内核从版本 2.4.19 开始陆续引入了 namespace 的概念.其目的是将某个特定的全局系统资源(global system resource)通过抽象方法使得namespace 中的进程看起来拥有它们自己的隔离的全局系统资源实例(The purpose of each namespace is to wrap a particular global system resource in an abstraction th

Docker底层存储结构

Docker底层存储结构 由于aufs并未并入内核,故而目前只有Ubuntu系统上能够使用aufs作为docker的存储引擎,而其他系统上使用lvm thin provisioning(overlayfs是一个和aufs类似的union filesystem,未来有可能进入内核,但目前还没有:Lvm snapshot are useful for doing e.g. backup of a snapshot, but regress badly in performance when you

Docker 底层实现

基本架构 Docker 采用了 C/S架构,包括客户端和服务端. Docker daemon 作为服务端接受来自客户的请求,并处理这些请求(创建.运行.分发容器). 客户端和服务端既可以运行在一个机器上,也可通过 socket 或者 RESTful API 来进行通信 Docker daemon 一般在宿主主机后台运行,等待接收来自客户端的消息. Docker 客户端则为用户提供一系列可执行命令,用户用这些命令实现跟 Docker daemon 交互 名字空间 名字空间是 Linux 内核一个强

docker的user namespace功能

docker的user namespace功能: 默认情况下:容器默认是以root账号进入的,即使指定默认账号,用户也可以通过--user 0来切到root账号,容器里的root和宿主机的root是同一性质,-v挂载宿主机任意目录后,可通过容器里的root账号对宿主机数据进行破坏,风险很大 user namespace功能可以规避这一问题,user namespace可以让容器有一个"假"的root用户,它在容器内是root,被映射到容器外一个非root用户,也就是说user name

Docker底层网络经典文章分享

说明 关于 docker 底层网络的原理介绍,网上有很多的博客等资源,下面分享些经典实例文章, 望大家共同进步- 分享 分享一 理解Docker单机容器网络 分享二 理解Docker跨多主机容器网络 大佬的博客地址:https://tonybai.com/articles/ 最后 以上分享的各大佬文章,如有侵权,请大佬与我联系,立删!最后,感谢开源,拥抱开源- 原文地址:https://blog.51cto.com/wutengfei/2484762