2019年容器突然火了,到底什么是容器( 二 )


特别简单的一句话就是,你的电脑只有 8G 内存,你会允许一个进程占用你的内存到 7G 嘛?一般情况下应该是不会吧,那样的话,做其他事情不都卡的要死嘛,对不对 。
所以在 Linux 中,提供了一种技术,来控制进程组所能使用的资源 。Cgroups 的有很多子系统,每一项子系统都有自己独有的资源限制能力,比如:

  • blkio :为块设备设定 I/O 限制,一般用于磁盘等设备;
  • cpuset :为进程分配单独的 CPU 核和对应的内存节点;
  • memory :为进程设定内存使用的限制;
  • cpu :使用调用程序为进程控制 CPU 的访问;Linux Cgroups 的设计还是比较易用的,它就是一个子系统目录加上一组资源限制文件的组合 。对于 Docker 等 Linux 容器项目来说,它们只需要在每个子系统下面,为每个容器创建一个控制组(即创建一个新目录),然后在启动容器进程之后,把这个进程的 PID 填写到对应控制组的 tasks 文件中就可以了 。至于在这些控制组下面的资源文件里填什么值,那就交给用户执行 docker run 时的参数来指定了 。
经过以上分析,我们可以了解到,容器这个听起来玄而又玄的概念,实际上它就是操作系统上的一种特殊的进程而已 。所以,容器本身并没有价值,有价值的是"容器编排" 。
当我们在谈容器的时候,其实我们在谈如何更好的去编排容器 。这也是为什么当下 k8s 这么火的原因 。
容器与虚拟机异同看到这里,你会不会有疑问,容器和虚拟机之间有什么不同呢?你可能看到过下面这个图片:
2019年容器突然火了,到底什么是容器

文章插图
 
 
在这张图的左边,画出了虚拟机的工作原理,其中 Hypervisor 的软件是虚拟机主要部分,它通过硬件虚拟化功能,将主机的 cpu,内存,I/O 设备等虚拟出来,在这些虚拟的硬件上,安装了一个新的操作系统,也就是图中的 GuestOS。
此时,用户的应用进程就可以运行在这个虚拟的机器中,它能看到的也就只有 GuestOS 的文件和目录,使用的也是这个机器里面的虚拟设备 。这就是为什么虚拟机能够将不同的应用进程相互隔离,因为它们所在的系统本来就不是同一个系统 。
这张图的右边则是容器,它只由应用程序本身和它的环境依赖(库和其他应用程序)两部分组成,并且是直接在宿主机上运行的 。当你想要启动容器的时候,根本不需要启动整个操作系统,因为它本来就是在这个操作系统上的 。
而且,因为容器直接在宿主机上,所有容器都共享这个底层操作系统,没有另外新装操作系统,这就使得容器不管是在体积上,还是启动速度方面,都会更快,开销更小,也更加容易迁移 。
还记得讲容器的时候,介绍的 Namespace 技术嘛,虚拟机是真实存在的,你可以直接在自己的电脑上创建一个,但是容器不一样,它没有一个真正的“容器”运行在宿主机里面,Docker 项目帮助用户启动的,还是原来的应用进程,只是在创建这些进程时,加上了 Namespace 参数罢了,但是对于宿主机来说,本质还是进程罢了 。

【2019年容器突然火了,到底什么是容器】


推荐阅读