容器技术概念详解
在前面的章节里,我们安装了 Linux,也安装了 Docker,接下来是不是该上手 Docker 的使用了呢?
先不要着急,通过《Docker简介》的章节介绍,相信我们已经对 Docker 有了初步的了解。但是回想下我们过往的学习经历,每当接触一个新的技术时,总会有一种陌生感,这个感觉主要来源于我们对这门新技术的基础概念没有认知,或者是理解得不够准确。这种陌生感可能会导致两个问题:
- 在学习过程中丧失乐趣和成就感;
- 对将来的深入学习造成障碍。
要排除这种陌生感,就一定要把最核心的基础搞明白,心急是吃不了热豆腐的。
我们知道 Docker 是一个开源的容器引擎,它的核心是容器技术。那么容器技术到底是什么呢?这一节我们就一起来了解下。
1. 容器技术的历史
2000 年,随着 FreeBSD 4.0 的发布,容器技术正式对外公开,这种技术可将 FreeBSD 系统分区为多个子系统,称为 Jail。Jail 是作为安全环境而开发的,Jail 的目的是让进程在经过修改的 chroot 环境中创建,而不会脱离和影响整个系统,在 chroot 环境中,已经对文件系统、网络和用户的访问都实现了虚拟化。2001 年,借助 VServer 项目,容器技术进入了 Linux。这项工作的目的是在高度独立且安全的单一环境中运行多个 Linux 服务器,之后 Linux 容器技术开始逐渐成形。
2. 容器技术与虚拟化
容器技术其实是一种基于虚拟化的沙盒技术。
沙盒(sandbox)是一种安全机制,为运行中的程序提供隔离环境。通常是作为一些来源不可信、具破坏力或无法判定程序意图的程序提供实验之用。
在计算机中,虚拟化是一种资源管理的技术,它将计算机的各种实体资源,如CPU、网络、内存及存储等,进行抽象后展示出来,使用户更方便地使用这些资源。
我们举一些常见的例子:
平台虚拟化
平台虚拟化是针对计算机和操作系统的虚拟化,也就是最常见的一种虚拟化技术,Hyper-V,Virtualbox,VMware 等产品都是应用这类虚拟化技术。
资源虚拟化
资源虚拟化是指对特定的计算机系统资源的虚拟化,例如对内存、网络资源等等。
应用程序虚拟化
应用程序虚拟化的一个最典型的应用就是 JAVA,生成的程序在指定的 JVM 虚拟机中运行。
那么容器技术属于哪一种虚拟化呢?
现在的容器技术,运行在操作系统之上,使用操作系统自身支持的机制(Namespace,CGroup,下面的章节会详细讲解),提供了相对独立的应用程序运行的环境,能够让应用程序间可以互不干扰地独立运行,也提供了资源控制的功能,能对其在运行中所使用的资源进行干预,可以理解为操作系统虚拟化的范畴。
3. 容器技术的实质
假定我们编写了一个批量运算加法的程序,这个程序的输入需要从一个文件 A 中读取,处理结果保存到另一个文件 B 中。当操作系统执行这个加法程序时,操作系统会根据程序的指引,从文件 A 中读取数据,保存到内存里,然后执行加法指令,CPU 与内存协作,完成了运算,将结果保存到 B 中。
在程序的运行过程中,计算机内存的数据,CPU 寄存器里的数据,内存堆栈中的指令,读取写入的文件,以及运行过程中计算机的状态,这些信息的集合,就是进程。
对于进程来说,它的静止态就是一个二进制可执行文件,它的运行态就是与它相关的计算机数据和状态的总和。而子进程的所有资源都继承父进程,只要控制住父进程的资源,通过父进程衍生的子进程也会被控制。
所以,简单来说容器技术的实质就是:通过各种手段,修改、约束一个"容器”进程的运行状态,按照用户的意图“误导”它能看到的资源,控制它的边界,从而达到环境隔离,或者说虚拟化的目的。
4. 小结
本节的内容可能有些抽象,别担心,到这里还不需要大家理解容器具体内容,本节最大的意义在于告诉大家以下两点:
- 不要把 Docker 的概念与容器技术概念混淆,他们并不是等价的;
- 容器的本质是一个进程。