0 引言
在学习docker的过程当中,我发现目前docker学习最大的障碍,不是网上的资源太少,而是网上的资源太多,资源太多带来的噪声让学习效率下降很多。而在讲解docker原理上,全部的讲解都是关于cgroups,namespace,aufs以及deviceMapper,这对于一个初学者来讲,就是用一堆名词替换另外一堆名词,因此我打算写一篇不涉及太多api的原理解析,在这篇解析中,将不会讨论:linux
- 一堆堆砌在一块儿的专有名词,让阅读者云里雾里
- 一大堆写满了专有名词的图,可是不给太多解释
这篇解析将会涉及:android
- 虚拟机的实现原理
- 虚拟机和容器的区别
在开始讨论前,先抛出一些问题,可先别急着查看答案,讨论的过程可让答案更有趣,问题以下:docker
1 虚拟机
先来理解一下虚拟机概念,广义来讲,虚拟机是一种模拟系统,即在软件层面上经过模拟硬件的输入和输出,让虚拟机的操做系统得以运行在没有物理硬件的环境中(也就是宿主机的操做系统上),其中可以模拟出硬件输入输出,让虚拟机的操做系统能够启动起来的程序,被叫作hypervisor。用一张图来讲明这个关系就是:windows
在这张图中:api
- 物理机被称为宿主机
- 虚拟机也被称为guest OS
- 而被hypervisor虚拟出来的硬件被称为虚拟硬件
好比,举一个你们都很熟悉的例子,在编写android程序时,调试和测试运行均可以在X86架构的台式机或笔记本进行,这就是一个典型的虚拟机例子,在这之中:服务器
- 宿主机就是台式机或笔记本
- 虚拟机就是虚拟出来的android
- 而模拟android的软件就是android box
固然android模拟机一个大问题就是:启动速度很是慢,最长可达10分钟或以上,这是由于单纯模拟硬件的输入输出,效率是不好的,因此这样的虚拟机若是真部署在服务器上,速度是感人的。架构
这个时候,就有计算机科学家提出了很是偷懒的想法:假如咱们不模拟硬件输入输出,只是作下真实硬件输入输出的搬运工,那么虚拟机的指令执行速度,就能够和宿主机一致了。固然这前提是宿主机的硬件架构必须和虚拟硬件架构一致。好比,app
- 咱们能够在linux的台式机上轻松模拟windows,并且这个windows的运行速度基本上和原生装一个windows速度差很少,由于windows也能被直接安装在这台台式机上。
- 这个思路对于在windows系统中运行android系统无论用,由于android系统的运行硬件通常是手机(arm系统,能够理解为不一样的硬件架构体系和cpu指令集),因此android模拟机仍是同样的慢。
因为本篇并非主要关于虚拟机的内容,因此这些点就点到而止,更多详细内容能够参阅:Hypervisor学习
2 容器的概念
通常来讲,虚拟机都会有本身的kernel,本身的硬件,这样虚拟机启动的时候须要先作开机自检,启动kernel,启动用户进程等一系列行为,虽然如今电脑运行速度挺快,可是这一系列检查作下来,也要几十秒,也就是虚拟机须要几十秒来启动。测试
- 从新来理解虚拟机的概念,计算机科学家发现其实咱们建立虚拟机也不必定须要模拟硬件的输入和输出,假如宿主机和虚拟机他们的kernel是一致的,就不用作硬件输入输出的搬运工了,只须要作kernel输入输出的搬运工便可,为了有别于硬件层面的虚拟机,这种虚拟机被命名为 操做系统层虚拟化:Operating-system-level virtualization 也被叫作容器
- 让咱们来回顾虚拟机的概念,在虚拟机的系统中,虚拟机认为本身有独立的文件系统,进程系统,内存系统,等等一系列,因此为了让容器接近虚拟机,也须要有独立的文件系统,进程系统,内存系统,等等一系列,为了达成这一目的,主机系统采用的办法是:只要隔离容器不让它看到主机的文件系统,进程系统,内存系统,等等一系列,那么容器系统就是一个接近虚拟机的玩意了
更多关于容器的内容能够看这份课件:https://courses.engr.illinois.edu/cs423/lectures/VirtOS.pdf
至此就能够回答引言提到的两个问题:
- Docker 容器有本身的kernel吗
- 没有,docker和宿主机共享kernel
- docker的kernel version由镜像肯定仍是由宿主机肯定
- 由宿主机决定
3 how to learn more
- 关于操做系统层的虚拟化的概念:Operating-system-level virtualization 以及包括freebsd jail有关的一系列其余的操做系统上类似的实现
- 想要了解更多,docker具体作了什么,能够参考:一篇不同的docker原理解析 提升篇 - uncle creepy的文章 - 知乎专栏
- 关于namespace,cgroups,aufs,deviceMapper 能够了解官方文档
- 在mac os和windows上运行docker的秘密:Boot2docker by boot2docker 就是经过这个叫作boot2docker的玩意启动了一个虚拟linux kernel,全部的docker容器都跑在这个kernel上