什么是容器
在一台 16 核 32G 内存的虚拟机上,需要跑 500+ 个用户的网站应用,我们当然希望网站的资源相互隔离,这样一个应用崩溃了,也不会影响其他的应用的运行。
要实现资源的隔离,最容易想到的当然是开若干虚拟机,在其上安操作系统,然后搭建应用。然而一台主机上,一般就能开10~15个虚拟机,如果在这台机器上开 500 个虚拟机,这台服务器估计早就不堪重负了。
有没有资源隔离能力不错,而且虚拟化开销还要小的方式,虚拟机实在太重了。
我们来看一下问题的症结,虚拟机在硬件平台上运行一层软件,抽象出CPU、内存等资源,然后可以在其上运行不同的操作系统、软件等。这种全虚拟化的形式,还有操作系统,当然很重
。
于是我们引入了容器,它只是把应用和运行时所需要的依赖打包为镜像,所以我们只需要开一个进程就可以运行这个镜像。
现在容器只是创建一个容器进程
而无需启动操作系统,这个过程只需要秒级的时间。而且因为可以轻量,可以在非常轻松的让让几十个服务在服务器中跑起来。
下图是虚拟机与容器的对比图,容器直接运行在Linux操作系统上,共享操作系统、依赖库等。
而且容器是直接在CPU本地运行指令,而不需要通过硬件辅助虚拟化等,所以效率会更高,启动会更快,更轻量。
可以将容器理解为沙盒
,每个容器运行一个应用,而且相互隔离,但是容器之间也可以相互通信。优点是:
- 将应用以及运行的环境打包成镜像,所以部署更快。
- 资源利用率高:因为不需要Hypervisor层支持,所以性能更好。
- 便于迁移:可以在任意平台上运行。
容器属于操作系统级虚拟化:内核通过创建多个虚拟的操作系统实例(内核和库)来隔离不同的进程。
容器带来的额外的东西
在文章微服务里面我们讲过,所谓微服务,就是将单个功能模块做为一套小型服务进行开发,可以通过自动化部署独立部署,而且实现资源的有效隔离。
现有的容器技术为微服务提供了很好的实现形式,微服务实例运行在容器上运行,实现了服务器资源的有效隔离。
而且用户的应用环境非常多,很可能出现开发环境与用户实际环境版本不同,或者说依赖不同,这样应用在运行的时候会出现各种问题。所以容器可以将应用所有的依赖环境进行打包,保证开发和生产的环境一致。做到“一次封装,到处运行”,这又和DevOps结合起来了。
当然与微服务一样,容器也有很多的缺点,比如复杂性增加了,需要Linux的支持等。