容器
容器是一种轻量级、可移植、自包含的软件打包技术,使应用程序可以在几乎任何地方运行。比如我们在自己本地的电脑上开发好应用后,把应用打包到容器内。然后就可以在不做任何改动的情况下在生产系统的虚拟机、物理服务器、云主机上运行。
容器不光指我们熟悉的Docker容器,还包含CoreOS的rkt等容器。为了保证容器生态的健康发展,保证不同容器之间能够兼容,包含Docker、CoreOS、Google在内的若干公司共同成立了一个叫Open Container Initiative(OCI)的组织,其目的是制定开放的容器规范。因为多种容器都是基于规范进行实现的,所以开发者可以无缝在各种容器实现之间的换,比如我之前使用的是Docker容器,但是后面如果切换到rkt容器,是很容易的事情。
虚拟机虚拟化是云计算的基础。其使得在一台物理的服务器上可以跑多台虚拟机,虚拟机共享物理机的CPU、内存、IO硬件资源,但逻辑上虚拟机之间是相互隔离的。物理机我们一般称为宿主机(Host),宿主机上面的虚拟机称为客户机(Guest)。
容器VS虚拟机容器由两部分组成:
- (1)应用程序本身;比如我们发布一个web应用,那么这里指web应用程序本身
- (2)应用的依赖: 比如应用程序需要的库(比如web应用依赖的配置文件以及依赖的jar包等)或其他软件容器在Host操作系统的用户空间中运行,与操作系统的其他进程隔离
传统的虚拟化技术,比如VMWare、KVM、Xen,目标是创建完整的虚拟机。为了运行应用,除了部署应用本身及其依赖(通常几十MB),还得安装整个操作系统(几十GB)。
如上图可知:
- 所有的容器内包含各自独立的应用,但是所有容器共享同一个linux内核(备注:每个容器有自己的用户态的文件系统),这使得容器在体积上要比虚拟机小很多。另外启动容器不需要启动整个操作系统,所以容器部署和启动速度更快、开销更小,也更容易迁移。
- 所有的虚拟机包含各自独立的应用,但是每个虚拟机拥有自己的操作系统,所以相比容器其体积更大,并且启动虚拟机需要启动整个操作系统,所以部署和启动速度更慢。