容器技术导入
一个新技术的出现,一定是为了解决一个问题的,而一个问题的出现一定有其背景和历史。我们在学习技术的同时,一定不要忽略了本原的问题,而迷失在了技术的细节中。 ——我说的
随着PaaS(Platform as a service)技术的普及,软件应当以什么样的方式进行交付成为了一个关键的问题,而容器通过“容器镜像”的概念,解决了软件应用打包这 个根本性难题。
容器技术诞生的背景
我们希望编写的代码可以“一次编写,到处运行”,但实际情况却是同一份代码,打包后,换一个环境就启动不了了,或者跑起来各种报错。这种问题在PaaS里变得更为棘手,我们需要做很多修改和配置以摸清PaaS的脾气,才能顺利的让软件跑起来。
究其原因,是因为软件的运行是依赖环境的,我们写的代码虽然是同一份,但环境却是千差万别的。就好像我们造了一辆跑车,希望它能顺利地跑起来,但环境有可能是水泥路,也有可能是崎岖不平的山地,甚至还可能是片湖泊。
那我们能不能把软件和它所依赖的环境看做一个整体,打到一个包里,作为一个整体来交付呢?当然可以,这样,软件是一致的,环境也是一致的,不管把它们丢到哪里,都能保证程序可以正常运行。
容器(确切地说,是容器镜像)就是这么一个概念,它把程序和它所依赖的环境看做一个整体,比如你的程序在本地运行,依赖的环境是CentOS 7.2,那么就把这个操作系统的ISO和你的程序放在一起打包,这样不论在哪里解压这个压缩包,都可以得到和你本地一模一样的环境。这就解决了本地和云端环境不一致的关键问题。
或许你会说,虚拟机技术也能解决同样的问题,但虚拟机的缺点在于它太笨重了,并且会消耗更多的资源。同样的程序,用容器技术打包可能只有几MB,几秒就能启动起来;而使用虚拟机技术则需要几GB和几分 钟。在程序运行的性能上,容器也比虚拟机要高很多。“敏捷”和“高性能”是容器相较于虚拟机最大的优势,也是它能够在PaaS这种更细粒度的资源管理平台上大行其道的重要原因。
容器技术简析
那容器是如何做到这些这种轻量级的打包交付的呢,让我们简单分析一下。
我们写的代码(编译后的可执行程序),平常都安安静静地躺在磁盘上,而一旦运行起来,它就变成了计算机里的数据和状态的总和,这就是它的动态表现,也就是进程。容器技术的核心,就是约束和修改进程的动态表现,从而为其创造出一个独立一致的环境。
下面我们以Linux操作系统为例,简单介绍下容器技术的核心实现原理。
Cgoups: 约束
Cgroups(Control Groups)是Linux内核提供的一种可以限制进程使用资源的机制,可以对CPU、内存、磁盘、网络带宽等资源实现精细化的控制。比如对于一个8核CPU的机器,你可以限制某个进程仅使用其中的2个核(上限),把剩下的留给其他进程。它最主要的作用,就是限制一个进程组能够使用的资源上限。