浅谈 Docker 底层原理
1 Docker 和虚拟机异同
如下图,来自 Docker 官网,左边为 Docker,右边为虚拟机,VM虚拟机是在宿主机器操作系统的基础上创建操作系统
。Docker是在宿主机器的操作系统上创建Docker引擎,直接调用硬件资源
。
但是 Docker 和虚拟机都有的相同点,那就是隔离性,Docker 最大优势就是相对于虚拟机更加的轻量级。
因此,我们可以总结出:
Docker 和虚拟机相同点:
隔离性
资源可分配
Docker 和虚拟机不同点:
虚拟机是硬件层抽象,虚拟硬件和操作系统,而 Docker 是应用层抽象,只虚拟化操作系统
Docker 相比虚拟机更加轻量级和便携
Docker 启动速度更快
2 Docker 底层原理
说到 Docker 的底层原理,不得不说下 Linux 中的两个关键性概念:cgroups 和 namespace,下面我们利用 wiki 的参考来进行下讲解。
2.1 cgroups
cgroups,其名称源自控制组群(英语:control groups)的简写,是 Linux 内核的一个功能,用来限制、控制与分离一个进程组的资源(如 CPU、内存、磁盘输入输出等)。
cgroups 的一个设计目标是为不同的应用情况提供统一的接口,从控制单一进程到操作系统层虚拟化(像 LXC)。
LXC,其名称来自 Linux 软件容器(Linux Containers)的缩写,一种操作系统层虚拟化(Operating system–level virtualization)技术,为 Linux 内核容器功能的一个用户空间接口。它将应用软件系统打包成一个软件容器(Container),内含应用软件本身的代码,以及所需要的操作系统核心和库。透过统一的名字空间和共享 API 来分配不同软件容器的可用硬件资源,创造出应用程序的独立沙箱执行环境,使得 Linux 用户可以容易的创建和管理系统或应用容器。
在 Linux 内核中,提供了 cgroups 功能,来达成资源的区隔化。它同时也提供了名称空间区隔化的功能,使应用程序看到的操作系统环境被区隔成独立区间,包括行程树,网络,用户 id,以及挂载的文件系统。但是 cgroups 并不一定需要启动任何虚拟机。
LXC 利用 cgroups 与名称空间的功能,提供应用软件一个独立的操作系统环境。LXC 不需要 Hypervisor 这个软件层,软件容器(Container)本身极为轻量化,提升了创建虚拟机的速度。软件 Docker 被用来管理 LXC 的环境。
cgroups 功能:
**资源限制:**组可以被设置不超过设定的内存限制;这也包括虚拟内存。
**优先级:**一些组可能会得到大量的 CPU 或磁盘 IO 吞吐量。
**结算:**用来度量系统实际用了多少资源。
**控制:**冻结组或检查点和重启动。
2.2 Namespace
名字空间(英语:Namespace),也称命名空间、名称空间等,它表示着一个标识符(identifier)的可见范围。一个标识符可在多个名字空间中定义,它在不同名字空间中的含义是互不相干的。这样,在一个新的名字空间中可定义任何标识符,它们不会与任何已有的标识符发生冲突,因为已有的定义都处于其他名字空间中。
在编程语言中,名字空间是对作用域的一种特殊的抽象,它包含了处于该作用域内的标识符,且本身也用一个标识符来表示,这样便将一系列在逻辑上相关的标识符用一个标识符组织了起来。许多现代编程语言都支持名字空间。在一些编程语言(中,名字空间本身的标识符也属于一个外层的名字空间,也即名字空间可以嵌套,构成一个名字空间树,树根则是无名的全局名字空间。
命名空间最典型的是在 Spring 的 IOC 配置文件中:
3 总结
Docker 是采用 Go 语言编写的项目,底层原理就是利用 Linux 的 cgroups 和 namespace,本质上就是操作系统的一个进程,cgroups 主要负责资源分配,namespace 主要负责容器间的隔离(包括进程和网络等等)。
参考链接:
https://zh.wikipedia.org/wiki/Cgroups
https://zh.wikipedia.org/wiki/LXC
https://zh.wikipedia.org/wiki/%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4
版权声明: 本文为 InfoQ 作者【Barry Yan】的原创文章。
原文链接:【http://xie.infoq.cn/article/88e5c409cac96c9011c7da1fb】。文章转载请联系作者。
评论