容器 (Container
) 是一种在资源隔离状态下,允许我们运行应用程序及其依赖项,操作系统层面的轻量级、虚拟化技术。在容器中,应用程序运行所依赖的必要组件都需要被打包为可被反复调用的单个镜像,镜像工作时运行在孤立的环境中,不共享 主机操作系统
的 内存
、 CPU
和 磁盘
,这保证了容器内的进程不能访问容器外的任何进程。
虚拟机 (Virtual Machine
) 通常包括整个操作系统和其应用程序,并且需要一个虚拟机管理程序来控制 VM
(虚拟机)。
因为囊括了整个操作系统,虚拟机的大小会达到几千兆字节 (1千兆字节 = 1GB),这样做的缺点之一是计算机会耗费几分钟去启动操作系统和初始化应用程序。另一方面,容器则是轻量级的且几乎只有几兆字节 (1兆字节 = 1MB),容器相较于虚拟机有性能强和立即启动的优势。
应用程序在计算环境改变后会出现很多问题。问题可能会出现在开发环境变为测试环境之后,进一步执行程序的过程中,比如,一名开发者在 Windows
环境下编写了一个程序,但上层环境 ( test
(测试)、 stage
(准上线)或 prod
(生产))却部署了在 Linux
上。在这种情况下,当操作系统发生变化后,应用程序部分功能会停止工作。所以,通常情况下,当配套软件不一致时,间歇性故障几率会更高。
正如 Docker
之父 Solomon Hykes
所言:"您在 Python 2.7
进行测试而使用 Python 3
进行生产;或者说您安装了与程序依赖不同版本的 SSL
库;再比如你在 Debian
测试却在 RedHat
下生产,在这些情况下,会出现很多古怪的错误。"
不止计算环境,网络环境也会发生改变。 Hykes
补充道:“网络拓扑结构,安全策略和存储都可能存在不同,但软件却不得不在上面运行。”
敏捷环境: 容器技术最明显的优势是它比 VM
(虚拟机)实例运行速度更快,容器轻量级的特点让它在性能和占用内存上开销更小。
提高生产力: 容器通过消除跨服务的依赖和冲突的方式提高开发人员的生产力。每个容器被看作一个微服务,因此可以在不需要考虑同步的条件下,彼此独立升级。
版本控制: 每一个容器镜像内含版本控制,因此能回溯到不同版本,注意版本之间的差别等。
可移植性高: 容器封装了针对应用程序的所有重要细节,比如程序依赖和操作系统,这帮助增强了容器镜像的可移植性,比如,相同镜像能被用来在 Windows
/ Linux
或者 dev
(开发) / test
(测试) / stage
(准上线) 环境中。
标准化: 绝大多数容器基于开放标准,能在主流的 Linux
发行版, Microsoft
等操作系统中运行
安全: 容器分别在进程和架构上彼此独立,因此单个容器的升级和调整不会影响别的容器。
复杂性增加:n
个容器同时运行应用程序时,复杂性因此增加,在生产环境中,管理这些容器是一个极具挑战的任务。 可以利用 Kubernetes
或者 Mesos
工具来管理 n
个容器。
本机需要 Linux
支持:绝大多数容器技术,比如 Docker
, 基于 Linux
容器 (LXC
), 与在 Linux
上运行这些实例相比,在 Microsoft
环境下运行这些容器会显得麻烦,它们的日常使用会带来复杂的问题。
不成熟:容器技术在市场中相对较新,因此进入市场的时间缓慢。可用资源的数量在开发人员中是有限的,如果遇到一些问题,可能需要一些时间才能找出解决方案。
操作系统容器 (OS Container
) :根据维基百科,“操作系统级虚拟化是一种计算机虚拟化方法,其中操作系统的内核允许存在多个孤立的用户空间实例,而不仅仅是一个,这种实例有时被称为容器,虚拟化引擎(VEs
)或监狱(jails
)(FreeBSD jail
或chroot jail
),从运行的程序角度来看,它们可能看起来就像真正的计算机。
如上所述,它们共享主机操作系统的内核,但提供用户空间隔离。不同的应用程序可以被安装,配置,并且可以像我们在主机操作系统上运行应用程序一样运行。同样,分配给容器的资源只对该容器可见。任何其他来宾操作系统映像将无法访问另一来宾操作系统的资源。
当需要配置一组具有相同配置的操作系统时,容器非常有效。因此,容器有助于创建与另一个操作系统具有类似风格的模板。
要创建操作系统容器,我们可以利用容器技术,如 LXC
,OpenVZ
,Linux VServer
,BSD Jails
和 Solaris zones
。
应用容器(Application Container
):根据维基百科,“应用程序虚拟化是一种软件技术,它将计算机程序从其执行的底层操作系统中进行封装。完全虚拟化的应用程序并不是按照传统的意义来安装的,尽管它仍然像以前一样被执行。应用程序在运行时表现得像直接与原始操作系统及其管理的所有资源进行交互,但可以在不同程度上进行隔离或沙箱化。
在这种情况下,“虚拟化” (Virtualization
) 是指被封装的工件(应用程序),它与硬件虚拟化中的含义完全不同,硬件虚拟化指的是物件被抽象(物理硬件)。
应用程序容器被设计为打包和运行单个进程,而在操作系统容器中,可以运行多个服务和进程。
像 Docker
和 Rocket
这样的容器就是应用程序容器的典型例子。