架构杂谈《七》
架构杂谈《七》
容器vs虚拟机
一、什么是虚拟机
二、什么是容器
容器是一种轻量级、可移植的为应用程序提供了隔离的运行空间。每个容器内都包含一个独享的完整用户环境,并且一个容器内的环境变动不会影响其他容器的运行环境,可以使应用程序在几乎任何地方以相同的方式运行(如 在开发人员自己的本子上创建并测试好的容器无须任何修改就能在生产环境中的虚拟机、物理服务器或者云上运行)
在技术方面,容器是通过一系列系统级别的机制来实现的(如:通过linux namespaces进行空间隔离,通过文件系统的挂载点来决定容器可以访问哪些文件;通过cgroups 来确定每个容器可以利用多少资源),容器之间通过共享同一个系统内核来提升内存的使用率。
三、容器与虚拟机的区别
容器是对应用层的抽象,它把应用程序的代码和相关依赖打包在一起执行,多个容器可以在同一台物理机上互不影响地独立运行,并且共享操作系统内核。启动快、占用空间少。而虚拟机是物理硬件层上的虚拟化,系统管理程序使虚拟机能够运行在同一台物理机上,但是每台虚拟机必须包括一整套操作系统、应用程序和各种依赖库等。启动慢、占用空间大。
四、容器主要解决的问题
容器有轻量级、可隔离性和可移植等特性,所以应用程序的容器化使得应用程序具备了超强的可移植性。
在 web 1.0 时代,信息是单向的,交互只在人与网络之间进行,大多人上网是为了看新闻,因此应用程序相对简单,一般采用 lamp。 ( linux-apache-mysql-php )的三层架构(presentation 、 application 、 data ),只需要部署到有限的几台物理服务器上;在如今的 web2.0甚至 web 3.0 时代,互联网连接一切,包括连接人与人、人与物、物与物,系统架构较 10 年前己经变得非常复杂,开发人员通常使用多种服务构建和组装应用,比如分布式消息队列 kafka、分布式缓存 redis、分布式文件系统 hdfs 或 spring cloud 或 azure service fabric等。复杂应用系统的相应部署环境也变得非常复杂,可能会部署到不同的环境中,比如开发服务器、测试服务器和生产服务器,服务器也可能是虚拟服务器、私有云或公有云等,如下图:
因为存在各种服务和环境,所以开发人员在编写代码时需要考虑不同的运行环境,运维人员则需要为不同的服务和平台进行各种配置,对于他们双方来说,这些都是艰巨的任务,那么如何让每种服务在所有的部署环境中顺利运行呢?容器就很好地帮我们解决了这个难题。
我们先联想下几十年前的运输行业,在每一次运输中,货主与承运方都会担心货物因种类不同而受损,比如易碎的东西被错误地压在了最下面。另 一方面,在运输过程中需要使用不同的交通工具,比如货物先被装上卡车运到码头,再被装上船,到岸后又被卸下船,再被装上火车 ,到达目的地再被卸下 。其中的大部分时间都花费在对不同物品的装货、卸货上,而且搬上搬下还容易损坏物品 。幸运的是,集装箱的发明解决了这个难题 : 任何货物,不管是床垫还是机器,都被放在各自的集装箱中,集装箱在整个运输过程中都是密封的,只有到达目的地才被打开。标准集装箱可以被高效地装卸、重叠和长途运输。现代化的起重机可以方便地在卡车、轮船和火车之间移动集装箱,集装箱被誉为运输业与世界贸易的最重要的发明。
docker 将集装箱思想运用到对软件的打包上,为代码提供了 一个基于容器的标准化运输系统,可以将任何应用及其依赖打包成一个轻量级、可移植、自包含的容器,可以运行在几乎所有操作系统上。
五、docker的优势
1)、docker 在开发方面的优势
每个人的开发环境都不一样,由于在开发过程中会不断地切换项目工程,所以每次都要不断的重复修改和设置开发环境,而docker可以使这一过程变得自动化,让开发人员更加关注软件开发(比如:开发人员使用docker后就不需要单独安装和配置数据库,也不需要担心不同版本的冲突问题),容器化的应用更容易构建、分享和运行,如果团队有新的同事加入,也不需要花费好几个小时讲解如何搭建环境及安装软件和相关的配置,只需要花费几分钟安装docker就能编译和调试程序了。
2)、docker 在运维方面的优势
docker 使软件的发布更加高效,不管是更新版本还是修复 bug,都能快速发布完成,并且能瞬间伸缩扩展。docker 能够实现自动化的编译、打包、测试和部署,运维人员不再需要wiki 、 readme 、 clecklist 文档,因为 docker 在开发、测试和生产环境中都使用了相同的镜像,所以更新时不会出现不一致的问题。
3)、docker 在容器和虚拟机方面的优势
docker 使容器和虚拟机相结合( docker machine 实现了容器和虚拟机的有效结合),使部署和管理应用变得更加灵活 。我们可以在虚拟机中启动一个容器,这里的虚拟机并不是由 docker控制的,而是通过现有的虚拟化管理设施来控制的 。一旦系统实例启动,就可以通过安装 docker来运行容器并进行其他特殊设置。同时由于不同的容器运行在不同的虚拟机上,容器之间也能有很好的隔离。
说明:
1、参考书籍:《分布式服务架构:原理、设计与实战》
2、如有不合适的地方请反馈。综合后更改。