容器
是一种轻量级的、操作系统级别的虚拟化技术,它允许我们在资源隔离的进程中运行应用程序及其依赖项。运行应用程序所需的所有必要组件都可以打包为单个可以复用的映像。当映像被执行时,它将运行在一个孤立的环境中,不会与宿主操作系统共享内存、CPU和磁盘。这样,就保证了容器内的进程不能看到容器外的任何进程。
虚拟机
通常包括整个操作系统和应用程序,同时,还需要运行在它们之上的虚拟机管理程序来控制虚拟机。
由于它们包括了操作系统,所以它们的大小多达几千MB。使用虚拟机的一个缺点是:它需要几分钟的时间才能启动操作系统和初始化它们托管的应用程序。与之相比,容器是轻量级的、大部分是MB大小的。与虚拟机相比较,容器的性能更好,并且可以立即启动。
当应用程序的计算环境发生变化时,许多问题都会显现,尤其是当开发人员将代码从开发环境推送到测试环境时。例如:开发人员在Windows中编写应用程序代码,但上层环境(dev/test/stage)是基于Linux的。在这种情况下,当操作系统发生变化时,某些功能可能会停止工作。所以,当配套的软件环境不一样的时候,间歇性故障的几率会更高。
正如Docker的创造者Solomon Hykes所说:“当你使用Python 2.7进行测试,然后在生产环境中使用Python 3,就很可能会发生一些奇怪的事情;或者当你依赖某个特定版本的SSL库的行为,但是却安装了另一个时;或者当你在Debian上运行测试,但是在RedHat上进行生产时,也可能发生各种奇怪的事情。”
这种变化可能不仅仅是计算环境的变化,也可能是网络环境的变化。Hykes还补充说:“当网络拓扑结构不同,或者安全策略和存储不同,同时软件必须在其上运行的时候(也可能发生各种奇怪的事情)。
操作系统容器: 根据维基百科,“操作系统级虚拟化是一种计算机虚拟化方法,其中操作系统的内核允许存在多个孤立的用户空间实例,而不是一个,这样的实例有时称为容器,或者虚拟化引擎(VE),或者监狱(FreeBSD jail或chroot jail),从正在运行的程序的角度来看,它们可能看起来就像真正的计算机。
如上所述,它们共享主机操作系统的内核,但提供用户空间隔离。可以安装、配置不同的应用程序,并且可以像我们在宿主操作系统上运行应用程序一样运行。同样,分配给容器的资源只对该容器可见。任何其他来宾操作系统映像将无法访问另一来宾操作系统的资源。
当需要配置一组具有相同配置的操作系统时,它们非常有用。因此,它有助于创建模板,这可以用来创建与另一个操作系统类似的风格。
我们可以利用LXC,OpenVZ,Linux VServer,BSD Jails和Solaris zones技术创建OS容器。
应用程序容器:根据维基百科,“应用程序虚拟化是一种软件技术,它将计算机程序从其执行的底层操作系统中进行封装。完全虚拟化的应用程序仍然像以前一样被执行,但它并不是按照传统的意义来安装的。应用程序在运行时表现得像直接与原始操作系统及其管理的所有资源进行交互,但可以在不同程度上进行隔离或沙箱化。
在这种情况下,术语“虚拟化”是指被封装的工件(应用程序),它与硬件虚拟化中的含义完全不同,它指的是被抽象的物件(物理硬件)。
应用程序容器被设计为将服务作为单个进程打包和运行,而在OS容器中,可以运行多个服务和进程。
像Docker和Rocket这样的容器技术就是应用程序容器的例子。