最近公司在创建一个内部使用的小应用,尝试使用了Docker这个已经被热炒很久的Devops神器, 部署了Jenkins,应用和数据库的服务,体会到了一处打包各处运行的便利。刚开始使用Docker, 有一种深深的感觉,它是一个轻量的虚拟机,再比较一番,它还是跟虚拟机有本质的区别。
Docker并不是轻量的虚拟机
因为Docker和虚拟机都为应用提供隔离的运行环境,并且由于Docker的易用性,很容易把它看成是轻量的虚拟机。但是它们在基础架构上是完全不同的。
要说明这个,我找了一个例子。我们可以把虚拟机看成是独栋别墅,作为别墅,它必须有自己的通风,供热和电力系统等基础设施,同时还有必须的卧室,客厅,洗手间和厨房等。如果觉得客厅房间不够,那么你不能共享这些基础设施,添加一个新的房间,而是要重新买一个房间足够的别墅。相比而言,docker容器更像是高层住房中的公寓,它们共享整个建筑的基础设施,可以在一栋住宅中拥有各种不同的户型(运行各种不同镜像的容器)。
从上面的比较中我们可以看到,它们虽然都是为应用提供独立的运行环境,但是他们的构建理念是完全不同的,虚拟机是要在硬件上隔离出完整操作系统的方方面面,但是docker容器是共享操作系统基础设施,并在docker主机上运行打包好运行环境的应用。所以docker并不是一个虚拟机技术,而是一个应用交付技术。在虚拟机的世界中,抽象的单位是一个包含应用代码和依赖资源的虚拟机,它打包应用在物理主机上运行依赖的所有资源,生成一个可以在各种主机上运行的二进制产品。在Docker的世界中,抽象的单位是应用,更准确的说是一个服务,一般一个应用都是由多个服务组成。基于Docker容器,我们的应用能更容易的被拆分成细粒度的组件,这种技术会改变我们应用架构的方式。
Docker容器的备份
我们怎么备份Docker容器呢?其实我们并不需要备份容器。在使用Docker时,应用数据并不在保存在容器中,它存储在位于运行docker的服务器上的命名卷(volume)中[一块物理存储空间], 卷可以在不同的容器间共享,我们只需要备份这些卷,并不需要备份容器。所以理想情况下,容器是无状态并且不可修改的。如果我们想更新应用,需要做的是更新Docker镜像,同时基于新的镜像重新创建容器,创建容器只需要花几秒钟。
最后
通过以上面的比对,我们可以发现Docker和VM是针对解决不同问题而提出的技术,一个是打包应用运行环境在各种操作系统上运行,一个是打包了部署应用的整个操作系统,并运行在各种服务器上。他们不仅不是一个有你没我的替代关系,而是互相结合可以发挥更大威力的组合。有了Docker,它将改变部署应用的方式,可以方便的配置出不同的运行环境,随着配置应用运行环境的成本降低,我们可以将应用拆解成粒度更小的服务,改变我们设计系统的方式。