转自:https://zhuanlan.zhihu.com/p/22382728html
https://zhuanlan.zhihu.com/p/22403015linux
在学习docker的过程当中,我发现目前docker学习最大的障碍,不是网上的资源太少,而是网上的资源太多,资源太多带来的噪声让学习效率下降很多。而在讲解docker原理上,全部的讲解都是关于cgroups,namespace,aufs以及deviceMapper,这对于一个初学者来讲,就是用一堆名词替换另外一堆名词,因此我打算写一篇不涉及太多api的原理解析,在这篇解析中,将不会讨论:android
在开始讨论前,先抛出一些问题,可先别急着查看答案,讨论的过程可让答案更有趣,问题以下:docker
先来理解一下虚拟机概念,广义来讲,虚拟机是一种模拟系统,即在软件层面上经过模拟硬件的输入和输出,让虚拟机的操做系统得以运行在没有物理硬件的环境中(也就是宿主机的操做系统上),其中可以模拟出硬件输入输出,让虚拟机的操做系统能够启动起来的程序,被叫作hypervisor。用一张图来讲明这个关系就是:ubuntu
在这张图中:windows
好比,举一个你们都很熟悉的例子,在编写android程序时,调试和测试运行均可以在X86架构的台式机或笔记本进行,这就是一个典型的虚拟机例子,在这之中:api
固然android模拟机一个大问题就是:启动速度很是慢,最长可达10分钟或以上,这是由于单纯模拟硬件的输入输出,效率是不好的,因此这样的虚拟机若是真部署在服务器上,速度是感人的。服务器
这个时候,就有计算机科学家提出了很是偷懒的想法:假如咱们不模拟硬件输入输出,只是作下真实硬件输入输出的搬运工,那么虚拟机的指令执行速度,就能够和宿主机一致了。固然这前提是宿主机的硬件架构必须和虚拟硬件架构一致。好比,网络
因为本篇并非主要关于虚拟机的内容,因此这些点就点到而止,更多详细内容能够参阅:Hypervisor架构
通常来讲,虚拟机都会有本身的kernel,本身的硬件,这样虚拟机启动的时候须要先作开机自检,启动kernel,启动用户进程等一系列行为,虽然如今电脑运行速度挺快,可是这一系列检查作下来,也要几十秒,也就是虚拟机须要几十秒来启动。
更多关于容器的内容能够看这份课件:https://courses.engr.illinois.edu/cs423/lectures/VirtOS.pdf
至此就能够回答引言提到的两个问题: