星球狂想战队|什么是Docker?看这一篇干货文章就够了

作者:码农的荒岛求生 来源:程序员小灰
星球狂想战队|什么是Docker?看这一篇干货文章就够了容器技术的起源假设你们公司正在秘密研发下一个“今日头条”APP , 我们姑且称为明日头条 , 程序员自己从头到尾搭建了一套环境开始写代码 , 写完代码后程序员要把代码交给测试同学测试 , 这时测试同学开始从头到尾搭建这套环境 , 测试过程中出现问题程序员也不用担心 , 大可以一脸无辜的撒娇 , “明明在人家的环境上可以运行的” 。
测试同学测完后终于可以上线了 , 这时运维同学又要重新从头到尾搭建这套环境 , 费了九牛二虎之力搭建好环境开始上线 , 糟糕 , 上线系统就崩溃了 , 这时心理素质好的程序员又可以施展演技了 , “明明在人家的环境上可以运行的” 。
从整个过程可以看到 , 不但我们重复搭建了三套环境还要迫使程序员转行演员浪费表演才华 , 典型的浪费时间和效率 , 聪明的程序员是永远不会满足现状的 , 因此又到了程序员改变世界的时候了 , 容器技术应运而生 。
有的同学可能会说:“等等 , 先别改变世界 , 我们有虚拟机啊 , VMware好用的飞起 , 先搭好一套虚拟机环境然后给测试和运维clone出来不就可以了吗?”
在没有容器技术之前 , 这确实是一个好办法 , 只不过这个办法还没有那么好 。
先科普一下 , 现在云计算其底层的基石就是虚拟机技术 , 云计算厂商买回来一堆硬件搭建好数据中心后使用虚拟机技术就可以将硬件资源进行切分了 , 比如可以切分出100台虚拟机 , 这样就可以卖给很多用户了 。
你可能会想这个办法为什么不好呢?
容器技术 vs 虚拟机我们知道和一个单纯的应用程序相比 , 操作系统是一个很重而且很笨的程序 , 简称笨重 , 有多笨重呢?
我们知道操作系统运行起来是需要占用很多资源的 , 大家对此肯定深有体会 , 刚装好的系统还什么都没有部署 , 单纯的操作系统其磁盘占用至少几十G起步 , 内存要几个G起步 。
假设我有一台机器 , 16G内存 , 需要部署三个应用 , 那么使用虚拟机技术可以这样划分:
星球狂想战队|什么是Docker?看这一篇干货文章就够了在这台机器上开启三个虚拟机 , 每个虚拟机上部署一个应用 , 其中VM1占用2G内存 , VM2占用1G内存 , VM3占用了4G内存 。
我们可以看到虚拟本身就占据了总共7G内存 , 因此我们没有办法划分出更多虚拟机从而部署更多的应用程序 , 可是我们部署的是应用程序 , 要用的也是应用程序而不是操作系统 。
如果有一种技术可以让我们避免把内存浪费在“无用”的操作系统上岂不是太香?这是问题一 , 主要原因在于操作系统太重了 。
还有另一个问题 , 那就是启动时间问题 , 我们知道操作系统重启是非常慢的 , 因为操作系统要从头到尾把该检测的都检测了该加载的都加载上 , 这个过程非常缓慢 , 动辄数分钟 , 因此操作系统还是太笨了 。
那么有没有一种技术可以让我们获得虚拟机的好处又能克服这些缺点从而一举实现鱼和熊掌的兼得呢?
答案是肯定的 , 这就是容器技术 。
什么是容器容器一词的英文是container , 其实container还有集装箱的意思 , 集装箱绝对是商业史上了不起的一项发明 , 大大降低了海洋贸易运输成本 。 让我们来看看集装箱的好处:

  • 集装箱之间相互隔离
  • 长期反复使用
  • 快速装载和卸载
  • 规格标准 , 在港口和船上都可以摆放
回到软件中的容器 , 其实容器和集装箱在概念上是很相似的 。
现代软件开发的一大目的就是隔离 , 应用程序在运行时相互独立互不干扰 , 这种隔离实现起来是很不容易的 , 其中一种解决方案就是上面提到的虚拟机技术 , 通过将应用程序部署在不同的虚拟机中从而实现隔离 。


推荐阅读