云计算(1)——docker的前世今生

三丰 soft张三丰

docker是什么?

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。

理解虚拟机

使用虚拟机运行多个相互隔离的应用时,如下图:

从下到上理解上图:

•基础设施(Infrastructure)。它可以是你的个人电脑,数据中心的服务器,或者是云主机。 •主操作系统(Host Operating System)。你的个人电脑之上,运行的可能是MacOS,Windows或者某个Linux发行版。 •虚拟机管理系统(Hypervisor)。利用Hypervisor,可以在主操作系统之上运行多个不同的从操作系统。类型1的Hypervisor有支持MacOS的HyperKit,支持Windows的Hyper-V以及支持Linux的KVM。类型2的Hypervisor有VirtualBox和VMWare。 •从操作系统(Guest Operating System)。假设你需要运行3个相互隔离的应用,则需要使用Hypervisor启动3个从操作系统,也就是3个虚拟机。这些虚拟机都非常大,也许有700MB,这就意味着它们将占用2.1GB的磁盘空间。更糟糕的是,它们还会消耗很多CPU和内存。 •各种依赖。每一个从操作系统都需要安装许多依赖。如果你的的应用需要连接PostgreSQL的话,则需要安装libpq-dev;如果你使用Ruby的话,应该需要安装gems;如果使用其他编程语言,比如Python或者Node.js,都会需要安装对应的依赖库。 •应用。安装依赖之后,就可以在各个从操作系统分别运行应用了,这样各个应用就是相互隔离的。

理解Docker容器

使用Docker容器运行多个相互隔离的应用时,如下图:

不难发现,相比于虚拟机,Docker要简洁很多。因为我们不需要运行一个臃肿的从操作系统了。

从下到上理解上图:

•基础设施(Infrastructure)。 •主操作系统(Host Operating System)。所有主流的Linux发行版都可以运行Docker。对于MacOS和Windows,也有一些办法”运行”Docker。 •Docker守护进程(Docker Daemon)。Docker守护进程取代了Hypervisor,它是运行在操作系统之上的后台进程,负责管理Docker容器。 •各种依赖。对于Docker,应用的所有依赖都打包在Docker镜像中,Docker容器是基于Docker镜像创建的。 •应用。应用的源代码与它的依赖都打包在Docker镜像中,不同的应用需要不同的Docker镜像。不同的应用运行在不同的Docker容器中,它们是相互隔离的。

对比虚拟机与Docker

Docker守护进程可以直接与主操作系统进行通信,为各个Docker容器分配资源;它还可以将容器与主操作系统隔离,并将各个容器互相隔离。虚拟机启动需要数分钟,而Docker容器可以在数毫秒内启动。由于没有臃肿的从操作系统,Docker可以节省大量的磁盘空间以及其他系统资源。

说了这么多Docker的优势,大家也没有必要完全否定虚拟机技术,因为两者有不同的使用场景。虚拟机更擅长于彻底隔离整个运行环境。例如,云服务提供商通常采用虚拟机技术隔离不同的用户。而Docker通常用于隔离不同的应用,例如前端,后端以及数据库。

容器发展之路

业务是运行在应用之上的,而应用一开始只能运行在物理服务器上。为了保障应用的平稳运行,我们采购的服务器通常性能都大于业务需求的性能。甚至我们通常在一个服务器上只运行一个应用,目的是应用之间不会相互影响。这无疑对服务器资源是个极大的浪费。

  后来,出现了虚拟机,虚拟机把服务器的资源给虚拟化了,可以在一台服务器上安装部署多个虚拟机。每个虚拟机的环境完全独立,大大提高了服务器的资源利用率,最终为公司节约了大量的资金支出。

  虚拟机很美好,但是有一个明显的缺点,就是依赖其OS。每个虚拟机都要安装一个OS,OS会占用额外的CPU、RAM和存储,此外OS还需要定期打补丁和监控,这些都需要资源。接下来就出现了容器技术,容器模型和虚拟机模型相似,其主要的区别在于,容器的运行不会独占操作系统。实际上,运行在相同宿主机上的容器是共享一个操作系统的,这样就能节约了大量的资源。虚拟机是虚拟化了硬件资源,而容器则是对系统做了虚拟化。这样带来的好处就是,资源利用率提高了,节省了资金成本。

  此外,容器技术还具有快速启动、便于迁移的特点,可以轻松把容器从笔记本迁移到服务器上。这就解决了一个运行环境的痛点了,不会再有人说为什么在我的电脑上能正常运行的,在服务器上就出错了,肯定是环境不一样造成的纠纷。

  说到容器技术,当然要提到其中的扛把子——Docker。容器技术不等于Docker,但是提到容器多数人都第一时间想到的是Docker。对容器发展影响比较大的技术包括内核命名空间(kernel Namespace)、控制组(Control Group)、联合文件系统(Union File System)以及Docker。事实上,容器化技术很早就出现了,历史甚至可以追溯到大型机的时代。

为什么对容器的资源进行可视化隔离?

容器技术提供了不同于传统虚拟机技术的环境隔离方式。通常的Linux容器对容器打包和启动进行了加速,但也降低了容器的隔离强度。其中Linux容器最为知名的问题就是资源视图隔离问题。

容器可以通过cgroup的方式对资源的使用情况进行限制,包括:内存,CPU等。但是需要注意的是,如果容器内的一个进程使用一些常用的监控命令,如:free,top等命令其实看到还是物理机的数据,而非容器的数据。这是由于容器并没有做到对/proc/sys等文件系统的隔离。

容器资源视图隔离有哪些应用场景?

在容器生产环境,通常有一些业务已经习惯了在传统的物理机,虚拟机上使用top,free等命令来查看系统的资源使用情况,但是容器没有做到资源视图隔离,那么在容器里面看到的数据还是物理机的数据。

在应用程序的视角来看,在容器里面运行进程和在物理机虚拟机上运行进程的运行环境是不同的。并且有些应用在容器里面运行进程会存在一些安全隐患:

•对于很多基于JVM的Java程序,应用启动时会根据系统的资源上限来分配JVM的堆和栈的大小。而在容器里面运行运行JAVA应用由于JVM获取的内存数据还是物理机的数据,而容器分配的资源配额又小于JVM启动时需要的资源大小,就会导致程序启动不成功。并且在Java应用里,一些Java库也会根据资源视图分配堆和栈的大小,这同样会存在安全隐患。 •在CPU上也会存在问题,大多数的应用程序,比如Nginx或者一些其它的中间件服务会根据其视图的cpuinfo文件信息设定默认的启动线程数。但是在容器内的进程总会从/proc/cpuinfo中获取到CPU的核数,而容器里面的/proc文件系统还是物理机的,从而会影响到运行在容器里面服务的性能。 消息中间件Rabbitmq(01) 消息中间件Rabbitmq(02) 消息中间件Rabbitmq(03) 消息中间件Rabbitmq(04) 消息中间件Rabbitmq(05) 消息中间件Rabbitmq(06) 消息中间件Rabbitmq(07)