docker 实现原理
实现原理
docker虚拟化
的核心是需要解决两个问题,资源隔离与资源限制
-
虚拟机是通过硬件虚拟化技术,通过一个
hypervisor
层实现对资源的彻底隔离 -
容器则是通过操作系统级别的虚拟化技术,利用
操作系统内核
的Cgroup
和Namespace
特性,此方法是完全通过软件的方式来实现的
nameSpace 资源隔离
命名空间是全局资源的一种抽象,将不同的资源放在不同的命名空间里,各个命名空间之间是相互隔离的。
CGroup 资源限制
通过 namespace
可以保证容器之间的隔离,但是无法控制每个容器占有多少资源。如果某个容器正在执行 CPU 密集型任务
,那么就会影响其他的容器中任务的性能与执行效率,导致多个容器相互影响并抢占资源。如何对多个容器资源的使用进行限制,就成了解决进程虚拟资源
Control Groups 简称(CGroups)就是能够隔离宿主机上的物理资源,如 CPU、内存、磁盘 IO 等,每个CGroup都是一组被相同的b标准和参数限制的进程。而我们需要做的就是把这个容器加入到指定的 CGroup中。
UnionFS 联合文件系统
docker
借助于 Linux
的 nameSpace 和 cGroup 分别解决了资源隔离和资源限制的问题,那么这个容器就是很轻量级的,
镜像的结构正如上图所示,是一层层的堆叠起来的,镜像中的这些层都是 只读层,当我们运行程序的时候,就是只要添加新的可写层即可(容器层)。对于运行中的容器所做的所有更改(比如写入新文件,修改现有文件,删除文件)都将写入这个容器层。
对于容器的操作,主要是使用了写时复制 (CoW) 技术。只有需要写时才去复制,Cow技术可以让所有的容器共享 image 文件系统。所有数据都从 image
中读取。只有对当前文件进行写操作时,才从 images 中把要写的文件复制到自己的文件系统进行更改。无论多少个容器都共享一个 images。