Docker系列开篇之Virtual Machine VS Container(一)
前言
本节开始我们正式进入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(一)的更多相关文章
- 虚拟机(Virtual Machine)和容器(Container)的对比
目前云计算平台常用的虚拟化技术有虚拟机(Virtual Machine)和容器(Container)两种.虚拟机已经是比较成熟的技术,容器技术作为下一代虚拟化技术,国内的各厂商应用还不广,但似乎其代表 ...
- Windows Azure Virtual Machine (26) 使用高级存储(SSD)和DS系列VM
<Windows Azure Platform 系列文章目录> Update: 2016-11-3,如果大家在使用Linux VM,使用FIO进行IOPS测试的时候,请使用以下命令: su ...
- [New Portal]Windows Azure Virtual Machine (11) 在本地使用Hyper-V制作虚拟机模板,并上传至Azure (1)
<Windows Azure Platform 系列文章目录> 本章介绍的内容是将本地Hyper-V的VHD,上传到Azure数据中心,作为自定义的虚拟机模板. 注意:因为在制作VHD的最 ...
- [New Portal]Windows Azure Virtual Machine (12) 在本地使用Hyper-V制作虚拟机模板,并上传至Azure (2)
<Windows Azure Platform 系列文章目录> 本章介绍的内容是将本地Hyper-V的VHD,上传到Azure数据中心,作为自定义的虚拟机模板. 注意:因为在制作VHD的最 ...
- Windows Azure Virtual Machine (31) 迁移Azure虚拟机
<Windows Azure Platform 系列文章目录> 为什么要写这篇Blog? 之前遇到过很多客户提问: (1)我之前创建的虚拟机,没有加入虚拟网络.现在需要重新加入虚拟机网络, ...
- Docker系列-(1) 原理与基本操作
Docker是一个开源的应用容器引擎,基于Go语言,并遵从Apache2.0协议开源. Docker可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到任何流行的Linux机器 ...
- docker系列之一:初见docker
什么是docker? docker是目前linux最流行的容器技术,Docker 将应用程序与该程序的依赖,打包在一个文件里面.运行这个文件,就会生成一个虚拟容器.程序在这个虚拟容器里运行,就好像在真 ...
- Azure PowerShell (6) 设置单个Virtual Machine Endpoint
<Windows Azure Platform 系列文章目录> 请注意: - Azure不支持增加Endpoint Range - 最多可以增加Endpoint数量为150 http:// ...
- Azure PowerShell (7) 使用CSV文件批量设置Virtual Machine Endpoint
<Windows Azure Platform 系列文章目录> 请注意: - Azure不支持增加Endpoint Range - 最多可以增加Endpoint数量为150 http:// ...
随机推荐
- storm资源冲突
本方案出自<storm应用实践:实时事务处理之策略>,简略的写了一部分,详细的方法就看书吧 1)集群中工作进程冲突: 解决:通过查看stormUI cluster summary中的fre ...
- sql语句的注意点
select * from CallRecords where CallerNumber=001 and TelNum=02088888881 or id=1; 如果 CallerNumber=0 ...
- 【数据库】Navicat Premium12远程连接MySQL数据库
目录 00. 目录 01. 环境介绍 02. Navicat安装 03. MySQL开启远程登录权限 04. Navicat连接MySQL 00. 目录 @ 参考博客:https://blog.csd ...
- 【基础算法-模拟-例题-金币】-C++
原题链接:P2669 金币 这道题目完全是一道模拟题,只要按照题目中的加金币的算法和sum累加就可以很轻易得出最终答案. 说一下有一些点需要注意: 1.用i来计每天发的金币数,n来计已经拿了金币的天数 ...
- 抓包自定义过滤器需加%XXXX%,如%third_play%
抓包自定义过滤器需加%XXXX%,如%third_play%
- c++小游戏——扫雷
#include<cstdio> #include<cstring> #include<algorithm> #include<conio.h> #in ...
- 洛谷P2265 路边的水沟
题目 题目背景 LYQ市有一个巨大的水沟网络,可以近似看成一个n*m的矩形网格,网格的每个格点都安装了闸门,我们将从水沟网络右下角的闸门到左上角的闸门的一条路径称为水流. 题目描述 现给定水沟网的长和 ...
- go 学习笔记之初识 go 语言
Go 是一种开源编程语言,可以轻松构建简单,可靠,高效的软件. 摘录自 github: https://github.com/golang/go,其中官网(国外): https://golang.or ...
- 通过自研数据库画像工具支持“去O”评估
“去O”,是近些年来一直很火的一个话题,随之也产生了各种疑惑,包括现有数据库评估.技术选型等.去O是项系统工程,需要做好充分的评估.本文通过自研工具,生成数据库画像,为去O评估提供一手数据,希望给大家 ...
- Shrio多Realm认证及认证策略
在大型的系统中,安全数据可能会存放在多个数据库中,而且每个数据的加密方式也是不一样的,那么单一的Realm就无法完成. 这时,就需要用到多Realm认证了,多Realm又涉及到认证策略,及在多个Rea ...