目录
什么是容器?
容器与虚拟机的区别
为什么要使用容器?
为什么这几年来容器技术一下子流行了起来?
什么是容器?
先看看我们生活中的容器。生活中见到的瓶瓶罐罐,就是容器,用来成放东西,并且保护里面的内容不被侵染。
LXC,是Linux Container的缩写,看名称就知道是容器了。是一种内核虚拟化技术,提供轻量级的虚拟化,以便隔离进程和资源。LXC所实现的隔离性主要是来自内核的命名空间, 其中pid,net,ipc,mnt,uts等命名空间将容器的进程、网络、消息、文件系统和hostname隔离开。
而Docker相当与是对LXC封装进行二次发行,利用LXC实现类似VM的功能。
看看Docker官网是如何介绍的:
容器是一个标准化的软件单元,它将代码及其所有依赖关系打包,以便应用程序从一个计算环境可靠快速地运行到另一个计算环境。Docker容器镜像是一个轻量的独立的可执行的软件包。包含程序运行的时候所需的一切:代码,运行时间,系统工具,系统库和设置。
我们不可避免地会遇到这种情况:同样的代码,运行环境发生变化之后无法正常运行。
这种运行环境的变化可以分成不同的维度:
比如代码从程序员的笔记本电脑切换到测试服务器,或者从一台物理服务器切换到公有云/私有云上;
代码依赖的运行库版本发生变化,比如开发时用的python2.7, 但生产机上用的python3
也可能是代码运行的操作系统发生了变化,比如开发及用的ubuntu,生产机用的redhat
程序员除了投入时间在应用程序本身开发上之外,还需要花费额外的精力去处理这种环境或者说infrastructure问题,有的时候很头痛。
作为一个应用程序开发人员,我对底层的这些环境问题不感兴趣,有没有一种办法能使的我不去考虑它们呢?有,使用容器技术。
简单地说,一个容器包含了完整的运行时环境:除了应用程序本身之外,这个应用所需的全部依赖、类库、其他二进制文件、配置文件等,都统一被打入了一个称为容器镜像的包中。通过将应用程序本身,和其依赖容器化,操作系统发行版本和其他基础环境造成的差异,都被抽象掉了。
容器与虚拟机的区别
为什么要和虚拟机做比较,用过虚拟机的同学应该知道,虚拟机也是将主机资源分配出一部分,进行隔离,提供另一个系统环境。
但是虚拟机是模拟出了一台完整的电脑,包括它的硬件资源,虚拟机是可以像电脑一样进入bios中,使用u盘安装系统的。
看看Docker官网的图解。
容器是应用层的抽象,它将代码和依赖关系打包在一起。多个容器可以在同一台机器上运行,并与其他容器共享操作系统内核,每个容器在用户空间中作为独立进程运行。容器占用的空间比VM少(容器映像的大小通常为几十MB),可以处理更多的应用程序,并且需要更少的VM和操作系统。
虚拟机(VM)是物理硬件的抽象,将一台服务器转变为多台服务器。管理程序允许多台VM在单台机器上运行。每个VM都包含操作系统的完整副本,应用程序,必要的二进制文件和库 - 占用数十GB。虚拟机也可能很慢启动。
为什么要使用容器?
首先建立在我们需要环境隔离的基础上。
根据上面的介绍,可以看出虚拟机,是主机级虚拟化,完整的虚拟出一台计算机,然后在虚拟出来的机器上安装操作系统,做到环境隔离。想想我们的服务部署在虚拟机上是什么情况。
为什么我们要使用容器?那得看看它带来的好处。
既然容器封装了所有运行应用程序所必需的相关的细节,比如应用依赖以及操作系统,这就使得镜像从一个环境移植到另外一个环境更加灵活。比如,同一个镜像可以在Windows或Linux,开发、测试或生产环境中运行。
标准化:大多数容器实现技术基于开放标准,可以运行在所有主流 的Linux 发行版、Microsoft等操作系统上。
容器镜像提供版本控制,这样就可以追踪不同版本的容器,监控版本之间的差异。
容器隔离带来的安全性:一台宿主机上可以运行多个容器,但这些容器内的进程是相互隔离的,且无法相互感知。其中一个容器的升级或者出现故障,不会影响其他容器。
相比虚拟机来说更加轻量级:
虚拟机和容器的目的类似,都致力于对应用程序及其关联性进行隔离,从而构建起一套能够不依赖于具体环境而运行的应用单元。
为什么这几年来容器技术一下子流行了起来?
随着微服务架构应用开发的普及,很多IT公司纷纷推出了基于微服务架构的新产品,就连SAP这种传统的企业管理软件巨头也发布了很多基于微服务的解决方案,比如Engagement center, revenue cloud等等。
起初微服务提供商倾向于把微服务部署在虚拟机里,这也能实现微服务的隔离性,但无法进行快速扩展,因为前面介绍过的虚拟机的实现原理,其启动需要耗费一些时间,无法立即对瞬时突增的负载或者流量做出反应。并且从成本考虑,使用传统的虚拟机技术,为了实现隔离性,每个应用或者说微服务都必须运行在一个虚拟机里,这种重复和浪费的操作系统和资源的分配,可以通过容器技术来避免,从而大大减少了云服务提供商对硬件的投入,节省了云服务中心的成本。