Docker

一篇文章读懂Docker

容器技术的起源

假设你们公司正在秘密研发下一个“今日头条”APP,我们姑且称为明日头条,程序员自己从头到尾搭建了一套环境开始写代码,写完代码后程序员要把代码叫给测试的同学进行测试,这时测试的同学开始从头到尾搭建这套环境,测试过程中出现问题程序员也不用担心,大可以一脸无辜的撒娇:“明明在人家的环境下可以运行的”。

测试同学测试完成后终于可以上线了,这时运维的同学又要重新从头到尾搭建这套环境,费了九牛二虎之力搭建好环境开始上线,完蛋,上线系统就崩溃了,这时心理素质好的程序员又可以施展演技了:“明明在人家的环境上可以运行的”。

整个过程可以看到,不但我们重复搭建了三套环境,还要迫使程序员转行演员浪费表演才华,典型的浪费时间和效率,聪明的程序员是永远不会满足现状的,因此又到了程序员改变世界的时候了,容器技术应运而生。

有的同学这个时候可能就会说:“等等,先别改变世界,我们有虚拟机啊,VMware好用的飞起,先搭建好一套虚拟机环境然后给测试和运维clone出来不就可以了么?”

在没有容器技术之前,这确实是一个好办法,只不过这个办法还没有那么好。

首先科普一下,现在的云计算底层的基石就是虚拟机技术,云计算厂商买回来一堆硬件搭建好数据中心后,使用虚拟机技术就可以将硬件资源进行切分了,比如可以切分出100台虚拟机,这样就可以卖给很多用户了。

那么,为什么虚拟机这个办法还不够好呢?

容器技术 VS 虚拟机

我们知道和一个单纯的应用程序相比,操作系统是一个很重而且很笨的程序,简称笨重,有多笨重呢?

我们知道操作系统运行起来是需要占用很多资源的,大家对此肯定深有体会,刚装好的系统还什么都没有下载,单纯的操作系统占用磁盘空间就至少几十G起步,内存要几个G起步。

假设我有一台机器,16G内存,需要部署三个应用,那么使用虚拟机技术可以这样划分:

这台机器上开了三个虚拟机,每个虚拟机上部署一个应用,其中VM1占用2G内存,VM2占用1G内存,VM3占用4G内存。

我们看到就虚拟机本身总共就占用了7G内存,因此我们没有办法划分出更多的空间从而部署更多的应用程序,可是我们需要部署的就是应用程序,我们要使用的也是应用程序而不是占用了很多内存空间的操作系统。

如果有一种技术可以让我们避免把内存浪费在“无用”的操作系统上,岂不是香的一批?这是问题一,主要原因就是操作系统太重了。

还有另一个问题,那就是启动时间问题,我们知道操作系统重启是非常慢的,因为操作系统要从头到尾把该检测的都检测了,该加载的都加载了,这个过程非常缓慢,动辄数分钟。

那么有没有一种技术可以让我们获得虚拟机的好处,同时又能克服上述的缺点,从而一举实现鱼和熊掌的兼得呢?

答案是肯定的,这就是容器技术

什么是容器?

容器一词的英文是container,其实container还有集装箱的意思,集装箱绝对是商业史上了不起的一项发明,大大降低了海洋贸易运输的成本,让我们看看集装箱的好处:

  • 集装箱之间相互隔离
  • 长期反复的使用
  • 快速装载和卸载
  • 规格标准,在港口和船上都可以摆放

回到软件中的容器,其实容器和集装箱在概念上是很相似的。

现代软件开发中,最显著的特点就是隔离,应用程序在运行时相互独立互不干扰,这种隔离实现起来是很不容易的,其中一种解决方案就是上面提到的虚拟机技术,通过将应用程序部署在不同的虚拟机中从而实现隔离。

但是虚拟机技术有上述提到的空间利用率低、操作系统启动时间长、笨重等缺点,那么容器技术又怎么样呢?

与虚拟机通过操作系统实现隔离不同,容器技术只隔离应用程序的运行时环境,但容器之间可以共享同一个操作系统,这里的运行环境指的是程序运行依赖的各种库以及配置。

从图中我们可以看到容器更加的轻量级且占用的资源更少,与操作系统动辄几个G的内存占用相比,容器技术只需要数M的空间,因此我们可以在同样规格的硬件上大量的部署容器,这是虚拟机所不能比拟的,而且不同于操作系统数分钟的启动时间,容器几乎瞬间启动,容器技术为打包服务栈提供了一种更加高效的方式。

那么我们该怎么使用容器呢?这就要讲到docker了。

注意,容器是一种通用技术,docker只是其中的一种实现。

什么是Docker?

docker是一个用Go语言实现的开源项目,可以让我们方便的创建和使用容器,docker将程序以及程序所有的依赖都打包到docker container,这样你的程序可以在任何环境都会有一致的表现,这里程序运行的依赖就是指容器,好比与集装箱;容器所处的操作系统就好比货船或港口,程序的表现只和集装箱有关系(容器),和集装箱放在哪个货船或港口没有关系。

因此我们可以看到docker可以屏蔽环境差异,也就是说,只要你的程序打包到了Docker中,那么无论运行在什么操作系统下的程序,行为都是一致的,程序员再也无法施展才华了。

此外Docker的另一个好处就是快速部署,这是当前互联网公司最常见的一个应用场景,一个原因在于容器启动速度非常快,另一个原因在于只要确保一个容器中的程序正确运行,那么你就能确信无论在哪些生产环境中部署,都可以正确运行。

留下评论

您的邮箱地址不会被公开。 必填项已用 * 标注