写点什么

入门解读:小白也能看懂的容器和虚拟机介绍

  • 2019-01-08
  • 本文字数:1802 字

    阅读完需:约 6 分钟

入门解读:小白也能看懂的容器和虚拟机介绍

如今,网络上对容器和虚拟机的比较很常见。理论上,正如大多数人所言,容器比虚拟机更好,甚至虚拟机会被彻底淘汰。但是,容器和虚拟机并不一定要站在对立面互相开撕,毕竟容器目前存在的很多问题并没有彻底解决,虚拟机的启动速度和内存开销也未必落后于容器。


因此,如果处于初级入门阶段,有必要认真了解容器和虚拟机的区别,以便做出更优选择。


开始之前,我们先想想应用程序在真实计算机环境中的运行情况。假设,我们需要运行 MySQL 数据库、Nodejs 应用程序和 MongoDB 数据库三个应用程序。真实的计算机环境需要配备服务器,这是运行操作系统的物理设备;主机操作系统,在服务器上运行的操作系统,比如可以选择 Linux Ubuntu。


如果希望应用彼此隔离,每个程序都有自己的操作系统,可以在 Linux Fedora 上运行 MySQL、在 Linux Ubuntu 上运行 Nodejs 并在 Windows 上运行 MongoDB。如果不依靠虚拟机和容器,这个过程需要用三台计算机实现,彼此之间还需要互相通信。

虚拟机

这种方式既不友好也不科学,虚拟机和容器的出现解决了这些问题。相较而言,虚拟机历史更久远,用户也更加熟悉。简单来说,虚拟机通过虚拟化来模拟真实计算环境,以执行在真实计算机上运行的应用程序。

优缺点

虚拟机的优点是可创建完全隔离的环境并实现完全虚拟化,每个虚拟机都有对应的 CPU 虚拟化。其缺点也很明显,重,虚拟机通常在繁重的隔离进程中执行,因为需要 Guest OS;性能一般,当虚拟机无法直接访问硬件(托管的虚拟机管理程序)时,需要在拥有一个层,这会明显降低性能。

研究进展

在理论层面, neclab 的研究学者已经把虚拟机的启动速度做到比 Docker 还快,并且内存开销比 Docker 更低,这些成果以 paper 形式发表在 SOSP’17 上。长期以来,由于虚拟机需要完整的操作系统,所以体积比较大,如果想优化速度必须精简操作系统。


论文作者提供了两种方法:一是 Unikernels,这种方法相对极端,简单来说是为应用专门定制操作系统内核,该内核只提供运行此服务最基本的功能;二是精简 Linux 内核只保留必要功能和模块,作者专门开发了 Tinyx 工具,根据应用 objdump 信息自动寻找依赖,并根据启发性测试不断寻找可关闭 linux 模块。这种方式不仅可以缩小镜像体积(与启动速度最相关的因素),还可以降低占用内存。

容器

简单来说,容器是与主机共享资源的独立进程。与虚拟机不同,容器不会虚拟化硬件,也不需要客户操作系统。在容器中,运行应用程序所需的必要组件都打包为单个映像,可重复使用。执行映像时,它在隔离环境中运行,不共享内存、CPU 或主机操作系统磁盘。这可以保证容器内的进程无法监视容器外的任何进程。

优缺点

容器的优点是由隔离进程执行但可与同一主机上的其他容器共享资源环境;允许将容器内部的文件和资源安装到外部;容器不在客户操作系统中运行,因此其过程是轻量级的,具有更好的性能,并可在几秒钟内启动。


容器的缺点有相同的 Host OS,当应用程序需要特定的操作系统并且使用虚拟机更容易实现时,我们可能会遇到这种情况;安全问题,容器相当于彼此隔离的进程,可以直接访问重要的命名空间,比如主机名、网络和共享内存。当然,这一点可以通过控制 root 用户有所缓解,但始终是个问题。

容器 VS 虚拟机

从舆论层面来看,我们似乎应该放弃虚拟机,毕竟不少媒体已经开始使用“虚拟机已死”的言论。但就可维护性而言,虚拟机的动态迁移等技术相对成熟,实现原理从根上就很简单,不需要操心少个依赖进程的内存没过去。所以,我们无法孤立分析二者的好坏,需要结合应用特点、解决问题和场景等因素选择。


实际上,容器诞生之初更多的目的是解决裸进程的隔离和部署问题,并不是冲着取代虚拟机。目前还有不少人选择应用虚拟机,如果场景和需求合适,也不妨将虚拟机和容器一起使用,比如,生产环境使用 Windows,但有一个仅在 Linux 上运行的应用程序,此时可以使用虚拟机运行 Linux 发行版,然后在此虚拟机中运行容器。当然,这件事情现在似乎也由云厂商代做了。


前不久,AWS 开源 Firecracker,这其实可以算是是容器和虚拟化优势结合的产物,专门用于创建和管理多租户容器以及基于函数的服务,利用传统虚拟机提供的安全性和工作负载隔离,同时兼具容器的资源效率。不少人认为这可能是未来虚拟机和容器的发展方向,今年可能会看到更多云计算厂商推出此类服务。


参考链接:https://dzone.com/articles/part-4-docker-images-in-more-details


https://dl.acm.org/citation.cfm?id=3132763


2019-01-08 08:2011911
用户头像
赵钰莹 极客邦科技 总编辑

发布了 884 篇内容, 共 651.6 次阅读, 收获喜欢 2680 次。

关注

评论

发布
暂无评论
发现更多内容

华云大咖说 | 华云数据企业开发测试平台解决方案

华云数据

新来的前端小姐姐问:Vue路由history模式刷新页面出现404问题

华为云开发者联盟

node.js Vue hash 404 history 模式

如何借助腾讯云简单、高效移动开发

腾讯云数据库

数据库 tdsql

干货 | TDSQL-A核心架构揭秘

腾讯云数据库

数据库 tdsql

【OpenIM原创】C/C++调用golang函数,golang回调C/C++函数

OpenIM

华为云GuassDB(for Redis)发布全新版本,两大核心特性正式亮相

华为云开发者联盟

数据库 华为云 GuassDB(for Redis) Lua脚本 SSL连接加密

资深Linux系统管理员常用的15个很好用的Cron工作示例

华为云开发者联盟

Linux Linux Cron 工作示例 应用程序 工作调度

腾讯私有云MySQL解决方案—TDSQL

腾讯云数据库

数据库 tdsql

TDSQL-A,全力应对海量数据实时分析需求

腾讯云数据库

数据库 tdsql

TDSQL 全时态数据库系统-理念与愿景

腾讯云数据库

数据库 tdsql

2021 Atlassian 大中华区用户大会来袭!

Atlassian

DevOps 敏捷 Atlassian Jira 敏捷精益

1ms的时延,10Gbps速率…5G通信技术解读

华为云开发者联盟

5G 物联网 通信 网络架构 网络切片

缓存和数据库一致性问题,看这篇就够了

Kaito

数据库 redis 缓存 后端 一致性

「免费开源」基于Vue和Quasar的前端SPA项目crudapi后台管理系统实战之模块管理(十四)

crudapi

Vue API crud crudapi qusar

web技术分享| webRTC 媒体流录制

anyRTC开发者

音视频 WebRTC 流媒体 web技术 流媒体录制

ThreadLocal在链路性能测试中实践

FunTester

多线程 ThreadLocal 性能测试 线程安全 FunTester

AI时代来袭,你的存储做好准备了吗?

焱融科技

AI 高性能 文件存储 云计算, 分布式,

用6年前的低性能电脑运行「360安全卫士极速版」,效果怎么样?

Regan Yue

安全 测评 病毒云查杀 9月日更

细节炸裂!阿里P8高管总结出这份1500页的Java编程思想(第六版)

Java~~~

Java 编程 架构 面试 JVM

字节再次出圈!GitHub上爆火一星期的算法刷题手册竟出自这人之手

Java~~~

Java 架构 面试 算法 刷题

飞桨中国行走进成都 与当地企业共话制造智能化升级

百度大脑

人工智能 飞桨

TDSQL Inside:从腾讯的分布式数据库能力到行业的能力

腾讯云数据库

数据库 tdsql

HTAP大潮下,TDSQL的探索与实践

腾讯云数据库

数据库 tdsql

紧锣密鼓完成小闭环,微型博客项目快快进入下一阶段

梦想橡皮擦

9月日更

一年数十万次实验背后的架构与数据科学

百度Geek说

人工智能 架构 数据科学

TDSQL的2020进化在未来之前,更在未来之后

腾讯云数据库

数据库 tdsql

【VueRouter 源码学习】第七篇 - 路由变化触发视图更新

Brave

源码 vue-router 9月日更

西部首个国家级车联网先导区获批,EMQ 联手中国移动打造 5G 交通生态链

EMQ映云科技

自动驾驶 车联网 5G 移动 emq

企业为什么要建设自有即时通讯软件系统

BeeWorks

阅读

Code Review在TDSQL-C 的应用实践

腾讯云数据库

数据库 tdsql

TDSQL“相似查询工具MSQL+”入选VLDB论文

腾讯云数据库

数据库 tdsql

入门解读:小白也能看懂的容器和虚拟机介绍_服务革新_赵钰莹_InfoQ精选文章