前言

本节开始我们正式进入Docker系列,网上关于Docker相关文章如数家珍,写博客至今,我也一直在朝着如何写出通俗易懂且不枯燥的文章这个目标前进,喃喃自语的同时也希望看到文章的童鞋能明白我在讲什么,将知识点叙述清楚没有,讲解的效果如何,是否有启发或收获,能够得到及时的反馈当然也能让我理解的更透彻,好了,我们开始吧。

Virtual Machine VS Container

开篇我不打算直接讲解各个概念,将虚拟机和容器作比较至关重要,这都是基本概念。既然是系列文章也要适合如我一样作为初学者的入门指南,希望本系列文章能帮助到大家。容器和虚拟机的问世是解决什么问题呢?换句话说它两的作用是什么呢?

容器和虚拟机的作用相似:都是将应用程序及其依赖隔离到可以在任何地方运行的独立单元,同时二者都消除了对物理硬件的需求,能更有效的使用计算机资源

讨论完相似,当然我也得说说二者的不同之处在哪里?区别在于二者的架构处理。下面我们来分别讲讲虚拟机和容器。

Virtual Machine

虚拟机的本质上对真实计算机的仿真,就好比玩具枪对真实枪支的仿真或模拟一样,功能类似,虚拟机借用Hypervisor(管理程序)在物理机器上运行,既然虚拟机可以在Hypervisor上运行,反之,Hypervisor可以在主机上运行,也可以直接在裸机上运行。说到这里,我们又得讲讲Hypervisor是啥玩意,刚才我们讲了Hypervisor(下面我们用管理程序代替)是虚拟机运行的软件,管理程序本身是运行在物理计算机上,这里的物理计算机我们称为【主机】,主机可以为虚拟机提供RAM和CPU,通俗一点讲则是为虚拟机提供内存存储和计算资源,主机为虚拟机提供了RAM和CPU,那么在一台主机上若有多台虚拟机,我们根据需要为多台虚拟机来划分或分发这些资源,因此,如果一台虚拟机运行着更多的应用程序,那么我们可能需要为其分配更多的资源,而不是为在一台主机上运行其他的虚拟机分配更多的资源。

在主机上使用管理程序运行的虚拟机,我们称为【客户机】,该客户机包含运行的应用程序以及应用程序所需要的任何内容,比如依赖的库等等,同时客户机还拥有自己的整个虚拟化硬件堆栈,比如包括虚拟化网络适配器、存储、CPU等等,通过这样描述,我们知道客户机拥有属于自己的一套完整的客户机操作系统,从内部来看,客户机有自己的专属资源,从外部来看,客户机共享主机资源。

综上所述,客户机可以托管虚拟机管理程序或裸机虚拟机管理程序而运行,那么这二者又有什么差异呢?

托管虚拟机管理程序运行在主机的操作系统上,比如运行OSX(苹果操作系统)的计算机可以在该OS(操作系统)之上运行Virual Box或Virtual Machine,同时最重要的一点是,因为虚拟机共享主机资源,所以虚拟机无法直接访问硬件,必须借助主机操作系统来进行访问。想必到了这里我们知道了托管虚拟机管理程序的好处是它并不需要关心底层硬件,也就是说底层硬件对虚拟机管理程序来说并不重要,就好比我们直奔菜市场,我们的任务或者重心放在买当天所需要的菜,而并不是关心菜是怎么种出来的一样,这个例子也恰巧说明了面向对象和面向过程的概念。而主机的操作系统负责硬件驱动程序而不是虚拟机管理程序本身,因为虚拟机管理程序和硬件之间多了夹带了附加层,所以带来了更多了资源开销,从而降低了虚拟机的性能。

裸机虚拟机管理程序通过在主机的硬件上安装和运行,因为它直接与底层硬件连接或打交道,所以解决了性能问题,它完全不需要运行主机操作系统,作为安装在主机上的操作系统当然主要就是为了管理程序,裸机虚拟机管理程序与托管虚拟机管理程序不同的是,裸机虚拟机管理程序拥有属于自己的设备驱动程序,可以直接与底层每个组件进行交互,以执行任何I/O或处理操作系统上特定的任务,如此可以在可伸缩性或稳定上而获得更好的性能。好了,到了这里我们讨论完了虚拟机管理程序和裸机虚拟机管理程序的区别,可能有一个大大的疑问,为何在虚拟机和主机之间要附带额外的这一层呢?因为虚拟机有属于自己一套虚拟化操作系统,而主机也有一套真实的操作系统,所以虚拟机管理程序为虚拟机提供管理和在执行虚拟机操作系统的平台上发挥着重要的作用,它允许主机在作为客户端运行的虚拟机共享其资源。

如下图(图片来源于园友:纯洁的微笑),虚拟机包含虚拟硬件、内核(即操作系统)、用户空间。

Container

我们来揭开容器的面纱,与虚拟化硬件的虚拟机不同的是,容器通过抽象用户空间来提供操作系统级虚拟化,如下图(图片来源于网络):

如上图仅仅只打包用户空间而不包含内核和虚拟硬件,每个容器都有属于自己的独立用户空间,以此来允许多个容器运行在单个主机上,也就是网上很多资料所提及的容器进一步封装了linux,占用资源少。同时我们也可以看到所有操作系统级的体系结构都在容器之间共享,这也就是网上很多资料所提及的容器轻巧的原因。

总结

本节内容我们就到这里,内容太多也容易引起视觉疲劳,不出意外的话,关于Docker系列,应该会坚持每日一更,感谢阅读,下节再会。

Docker系列开篇之Virtual Machine VS Container(一)的更多相关文章

  1. 虚拟机(Virtual Machine)和容器(Container)的对比

    目前云计算平台常用的虚拟化技术有虚拟机(Virtual Machine)和容器(Container)两种.虚拟机已经是比较成熟的技术,容器技术作为下一代虚拟化技术,国内的各厂商应用还不广,但似乎其代表 ...

  2. Windows Azure Virtual Machine (26) 使用高级存储(SSD)和DS系列VM

    <Windows Azure Platform 系列文章目录> Update: 2016-11-3,如果大家在使用Linux VM,使用FIO进行IOPS测试的时候,请使用以下命令: su ...

  3. [New Portal]Windows Azure Virtual Machine (11) 在本地使用Hyper-V制作虚拟机模板,并上传至Azure (1)

    <Windows Azure Platform 系列文章目录> 本章介绍的内容是将本地Hyper-V的VHD,上传到Azure数据中心,作为自定义的虚拟机模板. 注意:因为在制作VHD的最 ...

  4. [New Portal]Windows Azure Virtual Machine (12) 在本地使用Hyper-V制作虚拟机模板,并上传至Azure (2)

    <Windows Azure Platform 系列文章目录> 本章介绍的内容是将本地Hyper-V的VHD,上传到Azure数据中心,作为自定义的虚拟机模板. 注意:因为在制作VHD的最 ...

  5. Windows Azure Virtual Machine (31) 迁移Azure虚拟机

    <Windows Azure Platform 系列文章目录> 为什么要写这篇Blog? 之前遇到过很多客户提问: (1)我之前创建的虚拟机,没有加入虚拟网络.现在需要重新加入虚拟机网络, ...

  6. Docker系列-(1) 原理与基本操作

    Docker是一个开源的应用容器引擎,基于Go语言,并遵从Apache2.0协议开源. Docker可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到任何流行的Linux机器 ...

  7. docker系列之一:初见docker

    什么是docker? docker是目前linux最流行的容器技术,Docker 将应用程序与该程序的依赖,打包在一个文件里面.运行这个文件,就会生成一个虚拟容器.程序在这个虚拟容器里运行,就好像在真 ...

  8. Azure PowerShell (6) 设置单个Virtual Machine Endpoint

    <Windows Azure Platform 系列文章目录> 请注意: - Azure不支持增加Endpoint Range - 最多可以增加Endpoint数量为150 http:// ...

  9. Azure PowerShell (7) 使用CSV文件批量设置Virtual Machine Endpoint

    <Windows Azure Platform 系列文章目录> 请注意: - Azure不支持增加Endpoint Range - 最多可以增加Endpoint数量为150 http:// ...

随机推荐

  1. (数据科学学习手札64)在jupyter notebook中利用kepler.gl进行空间数据可视化

    一.简介 kepler.gl是由Uber开发的进行空间数据可视化的开源工具,是Uber内部进行空间数据可视化的默认工具,通过其面向Python开放的接口包keplergl,我们可以在jupyter n ...

  2. spark 源码分析之五 -- Spark内置RPC机制剖析之一创建NettyRpcEnv

    在前面源码剖析介绍中,spark 源码分析之二 -- SparkContext 的初始化过程 中的SparkEnv和 spark 源码分析之四 -- TaskScheduler的创建和启动过程 中的C ...

  3. 利用MAT分析JVM内存问题,从入门到精通(二)

    上一篇文章MAT入门到精通(一)介绍了MAT的使用场景和基本概念,这篇文章开始介绍MAT的基本功能,后面还有两篇,一篇是MAT的高级功能,另一篇是MAT实战案例分析. 三.欢迎页 使用MAT打开一个h ...

  4. MYSQL事务、锁

    MYSQL事务 事务: 原子性 : 要么都执行,要么都不执行. 一致性: 结果要么都成功 ,要么都失败. 隔离性: 事务之间是互不干扰的 持久性: 事务一旦被提交,对数据库的改变是永久性的. 事务的隔 ...

  5. os.path.dirname(__file__)

    os.path.dirname(__file__) 返回脚本的路径 描述: 必须实际存在的.py文件,如果直接在命令行执行,则会引发异常NameError: name 'file' is not de ...

  6. pdfminer获取每页的layout

    #! python2 # coding: utf-8 import sys from pdfminer import pdfparser from pdfminer import pdfdocumen ...

  7. Python PyQT5的入门使用

    Python 3+ PyQT5的入门使用 窗口类型介绍 QMainWindow,QWidget和QDialog都是用来创建窗口的.可以直接使用也可以继承后再使用. QMainWindow 该类窗口可以 ...

  8. Spring Boot 2.0 迁移指南

    ![img](https://mmbiz.qpic.cn/mmbiz_jpg/1flHOHZw6Rs7yEJ6ItV43JZMS7AJWoMSZtxicnG0iaE0AvpUHI8oM7lxz1rRs ...

  9. WinForm控件之【CheckBox】

    基本介绍 复选框顾名思义常用作选择用途,常见的便是多选项的使用: 常设置属性.事件 Checked:指示组件是否处于选中状态,true为选中处于勾选状态,false为未选中空白显示: Enabled: ...

  10. 8086 IO读写操作

    如图所示,通过8086来读写io口,实现流水灯以及开关.本电路是基于8086最小模式下的三总线结构添加的,三总线结构原理较为复杂本篇就不对其原理进行介绍了,大家可以自行查阅相关引脚的功能从而实现. 本 ...