另一种虚拟化
docker作为一种将应用及其依赖进行package后发布的容器,就像可以被货轮承载和迁移的集装箱一样。现在的港口的设备当然是很强力了,不过在以前,货物达到码头后,还是需要码头工人来搬运,这似乎就是"docker"一词的原意。
作为一种基于OS的虚拟化技术,和传统的基于hypervisor的虚拟机技术一样,都是需要共享物理主机上的资源。但相比hypervisor中的Virtual Machine(以下简称VM)而言,docker的隔离度更弱,但同时资源消耗更小,相同平台可运行的container数目也更多。
而且,由于docker中的container是共享底层OS的,因此启动非常迅速。而像KVM这样的hypervisor在启动一个VM的时候,需要解压和引导VM所使用的内核,因而耗时更长。
三大支撑技术
docker最初是基于Linux设计的容器技术(现在也可以通过docker toolbox在Windows上做一个模拟层来移植到Windows上),它的实现依赖于Linux中众多的基础机制,包括用于资源限制的cgroup,用于隔离的Namespace,以及用于实现docker文件系统的Union FS等。
画土分疆 - Control Group
为什么要有group
"cgroup"代表的是"control group",这里"group"是进程的集合。“进程的集合”似乎不是一个新鲜的概念,「进程组」不就是吗?对,但「进程组」的这个集合包括的是协同工作的一组进程(比如作为整体去接收信号),而cgroup这个集合的主要目的在于控制资源的使用:多个进程作为一个整体享有资源的配额(quota),同时接受资源的限制。
在cgroup出现之前,只能对一个进程做一些资源控制,例如通过"nice"值限定对CPU的使用,或者用ulimit限制一个进程的打开文件上限、栈大小等。而cgroup可以对进程进行任意的分组,如何分组是用户自定义的