浅谈 Docker Namespace和Cgroups

60 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第15天

作者按:

前面所写介绍了容器是什么,docker的发展历程、还有k8s出现的过程。看见有朋友评论,说了容器不应该讲讲Namespace和Cgroups吗。2002年左右,命名空间一直是linux内核的一部分,直到2013年,对于容器的支持才被添加到linux内核,我对此也研究了一阵,下面是我个人对此的一点见解,一起来了解一下。

1、容器

容器具体是什么,不得不说Namespace和Cgroups,有朋友若问你linux里面跑容器跑的到底是什么,你可先回答此二关键字,Namespace(命名空间)和Cgroups(Control groups 机翻为控制组),它们就是可以让程序在一个空间里隔离运行,这个空间里面的资源是可控的,关键是环境隔离,如此可大概的回答你朋友之疑问了。

2、Namespace

命名空间是Luinux内核中的一个功能,也是容器运用的基础。命名空间提供了一层隔离、docker利用多种类型命名空间来提供容器所需的隔离,既能实现不影响主机系统,又能实现可移植的功能,容器在其单独的命名空间中运行,权限也限制在这个命名空间当中。

容器运行时,进程、还有网络、还有文件系统都是独立起来的,那就有朋友疑惑了,这隔离的独立的运行环境是怎么建立的?这就是 Namespce起作用,这个概念咱们来分析分析,直接搞一个运行的容器来看看Namespace是什么玩意?

docker exec dcokerid ps -ef 就是进入容器执行ps命令

(当然有可能有的容器用不了ps命令,还要装ps命令使用相关服务)

发现几个nginx服务

如果不进入容器,直接ps -ef就会看到很多进程,然后grep这几个服务

这两种结果,有啥不一样呢,对比了一下,最大的不同就是进程的pid不一样,ps-ef 和docker exec ps -ef 结果为什么不同,这里就要搞清楚linux里面namespace的概念,linux系统在创建容器的时候,就会有一个pid的命名空间,这个PID就是进程的序号,编号。建立一个namspace,就会对进程进行pid编个号码,每个命名空间里的pid编号都是从NO1开始。就是一个进程命名空间里只能看到自己个这个空间里的进程,看不到别的namespace里面的进程。如果有另外一个容器,那么它也会有自己的一个pid namespace,这两个空间之间都看不到对方的进程。linux系统的namespace太强了,其实也就是蒙蔽了对方空间双眼。容器之间你有啥资源我看不见,我有什么你也看不见,反正就是隔离了,互不打扰,这样资源能利用性就变大了,可以充分利用宿主机资源,而且保障了安全。

宿主机的pid namespace,他是把这台机器上所有的进程,进行编号,和容器里面pid namespace里的编号就不同了,这就是为啥编号不一样。

这个namespace可以有不同的类型,除了pid namespace还有比如network space负责隔离不同的网络环境,mount namespace可以隔离文件系统,还有系统进程通信、hostanme、user共计6种。反正就是这些namspace,才让我们得以隔离出一个个容器,这一个个小系统,小的独立的计算机,那容器算一个小计算机,这里面啥配置啊?

3、Cgroups

要说到这小容器计算机啥配置,就得说这个Cgroups了。有两个版本,V1和V2,目前正在用的还是v1较多。这个东西可以对特有的各种进程做各种计算机资源的限制,比如cpu、内存、io、等等的,反正没有这东西,一个进程搞出来好多个线程,你这宿主机的资源cpu内存直接给你占满,这东西真的很强。有资源限制、优先级控制、记录状态,控制进程状态的功能。

Cgroups,就是可以对一个或者一些进程的分配计算机资源,消耗啥的进行一系列限制。具体咋实现的,朋友们可以单独研究下linux 关于cgroups的定义,我后期也会单独写一下。

Cgroups通过各种不同的子系统限制不同的资源,每个子系统都能沟限制一种资源,就各司其职,相关的进程我给你分配一个相关的控制组,然后通过树结构管理。每个控制组有自己的相关资源控制参数。启动容器进程后,把这个进程pid写到对应的控制组的文件里可以起到限制作用。

Cgroups主要包括两部分:subsystem、hierarchy。Subsystem就是一个内核模块,就是用来调度资源,还有限制使用时间等具体待探究,hierarchy,相当于一颗cgroup树,树上的每个节点就是一个进程组,每棵树会有零到多个subsystem。

嗯,关于容器实现技术的介绍大致到此,就记住namspace是实现各种资源的隔离、而cgroups限制了各种资源能使用的量。说简单点就是Nameaspace+Cgroups技术,首写字母可简称牛叉组合技术! 但NC技术也不是完美的,关键在于这个限制资源,不一定啥都限制全,所以这个也是一个需要解决的问题!祝学习顺利!# 浅谈 Docker Namespace和Cgroups