0 引言

在学习docker的过程中,我发现目前docker学习最大的障碍,不是网上的资源太少,而是网上的资源太多,资源太多带来的噪声让学习效率降低不少。而在讲解docker原理上,所有的讲解都是关于cgroups,namespace,aufs以及deviceMapper,这对于一个初学者来说,就是用一堆名词替换另一堆名词,所以我打算写一篇不涉及太多api的原理解析,在这篇解析中,将不会讨论:

  • 一堆堆砌在一起的专有名词,让阅读者云里雾里
  • 一大堆写满了专有名词的图,但是不给太多解释

这篇解析将会涉及:

  • 虚拟机的实现原理
  • 虚拟机和容器的区别

在开始讨论前,先抛出一些问题,可先别急着查看答案,讨论的过程可以让答案更有趣,问题如下:

  • Docker 容器有自己的kernel吗
  • docker的kernel version由镜像确定还是由宿主机确定

1 虚拟机

先来理解一下虚拟机概念,广义来说,虚拟机是一种模拟系统,即在软件层面上通过模拟硬件的输入和输出,让虚拟机的操作系统得以运行在没有物理硬件的环境中(也就是宿主机的操作系统上),其中能够模拟出硬件输入输出,让虚拟机的操作系统可以启动起来的程序,被叫做hypervisor。用一张图来说明这个关系就是:

在这张图中:

  • 物理机被称为宿主机
  • 虚拟机也被称为guest OS
  • 而被hypervisor虚拟出来的硬件被称为虚拟硬件

比如,举一个大家都很熟悉的例子,在编写android程序时,调试和测试运行都可以在X86架构的台式机或笔记本进行,这就是一个典型的虚拟机例子,在这之中:

  • 宿主机就是台式机或笔记本
  • 虚拟机就是虚拟出来的android
  • 而模拟android的软件就是android box

当然android模拟机一个大问题就是:启动速度非常慢,最长可达10分钟或以上,这是因为单纯模拟硬件的输入输出,效率是很差的,所以这样的虚拟机如果真部署在服务器上,速度是感人的。

这个时候,就有计算机科学家提出了非常偷懒的想法:假如我们不模拟硬件输入输出,只是做下真实硬件输入输出的搬运工,那么虚拟机的指令执行速度,就可以和宿主机一致了。当然这前提是宿主机的硬件架构必须和虚拟硬件架构一致。比如,

  • 我们可以在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和宿主机共享kerneldocker的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上
https://zhuanlan.zhihu.com/p/22382728

一篇不一样的docker原理解析相关推荐

  1. 一篇不一样的docker原理解析 提高篇

    在上一篇 一篇不一样的docker原理解析 - uncle creepy的文章 - 知乎专栏 中,主要讨论了容器和虚拟机的区别,在实现细节上并没有深入,只是点到即止,在这篇提高篇中,将详细讨论容器的实 ...

  2. dubbo学习篇1 注解之 @Reference 原理解析

    一. 使用注解 在dubbo springboot 使用时,在需要调用的服务接口上使用 @Reference 即可直接调用远程服务 @Reference(version = "1.0.0&q ...

  3. go python java_一文助你搞懂参数传递原理解析(java、go、python、c++)

    前言 最近一年多的时间陆续接触了一些对我来说陌生的语言,主要就是 Python 和 Go,期间为了快速实现需求只是依葫芦画瓢的撸代码:并没有深究一些细节与原理. 就拿参数传递一事来说各个语言的实现细节 ...

  4. Log4js原理解析

    Log4js原理解析 基于log4js 0.6.14版本 Log4js总共三篇博客 <Log4js原理解析>http://blog.csdn.net/hfty290/article/det ...

  5. 秋色园QBlog技术原理解析:性能优化篇:用户和文章计数器方案(十七)

    2019独角兽企业重金招聘Python工程师标准>>> 上节概要: 上节 秋色园QBlog技术原理解析:性能优化篇:access的并发极限及分库分散并发方案(十六)  中, 介绍了 ...

  6. 秋色园QBlog技术原理解析:性能优化篇:数据库文章表分表及分库减压方案(十五)...

    文章回顾: 1: 秋色园QBlog技术原理解析:开篇:整体认识(一) --介绍整体文件夹和文件的作用 2: 秋色园QBlog技术原理解析:认识整站处理流程(二) --介绍秋色园业务处理流程 3: 秋色 ...

  7. clickhouse原理解析与应用实践_Hybrid App (混合应用) 技术全解析 方案原理篇

    引言 随着 Web 技术和移动设备的快速发展,Hybrid 技术已经成为一种最主流最常见的方案.一套好的 Hybrid架构方案 能让 App 既能拥有极致的体验和性能,同时也能拥有 Web技术 灵活的 ...

  8. 秋色园QBlog技术原理解析:性能优化篇:打印页面SQL,全局的SQL语句优化(十三)...

    文章回顾: 1: 秋色园QBlog技术原理解析:开篇:整体认识(一) --介绍整体文件夹和文件的作用 2: 秋色园QBlog技术原理解析:认识整站处理流程(二) --介绍秋色园业务处理流程 3: 秋色 ...

  9. 秋色园QBlog技术原理解析:系列终结篇:最后的AOP策略(十九)

    2019独角兽企业重金招聘Python工程师标准>>> 开篇闲话: 好几个月没写文章了,从9月15号发布新浪"微博粉丝精灵"V1.0后,持续的几个月都在折腾它,现 ...

最新文章

  1. Open3d学习计划—高级篇 2(彩色点云配准)
  2. 浮点运算为什么不准?有人为0.30000000000000004建了个网站
  3. 腾讯云主机安全防护(云镜卸载)--/usr/local/qcloud/YunJing/YDEyes/YDService
  4. Jboss启动报错之8083 already in use
  5. 如何理解高光谱图像数据
  6. CTFshow 信息收集 web2
  7. 数据库唯一主键如何实现幂等性?
  8. androidmanifest.xml权限中文说明
  9. 红旗linux安装oracle,Redflag Linux安装Oracle 10gR2 RAC记事
  10. python海贼王logo_Python 实现的下载op海贼王网的图片(网络爬虫)
  11. [转载]帮你入门 详解JRE和JDK的区别
  12. layui之获取form表单的radio
  13. Windows下MySql主从配置实战教程
  14. 长语音识别_长文本语音识别_语音 识别 - 云+社区 - 腾讯云
  15. c语言基础知识孙小红,基于J2EE的C语言在线学习系统的设计与实现
  16. CentOS中MySQL5.6 数据库主从(Master/Slave)同步安装与配置详解
  17. java 运行 依赖_java – 运行时中的依赖项确定
  18. Win10查看电脑的开机时间和关机时间记录
  19. 2019 Python接口自动化测试框架实战开发(一)
  20. 产品经理:一个商业 AIoT 智能硬件产品的完整拆解

热门文章

  1. linux 自学系列:用户管理
  2. 编程方法学4:计算机科学发展简史
  3. netfilter/iptables全攻略
  4. 【算法】一个简单的k均值(k-means)原理
  5. 清华物理化学97—13真题,部分是回忆版
  6. [MATLAB调试笔记]Possion方程求网格点电场强度
  7. 机器学习实用指南:如何从数据可视化中发现数据规律?
  8. linux read01,Linux内置命令之read
  9. es根据字段长度过滤_Es 根据数组长度查询
  10. 一碗面,害了一个孩子,却惊醒了中国无数父母!