Docker火了,有多火你自己看看下面的统计数据就知道了

在发布4个月的时间里,下载量就超过50000次,github上收到超过4000个star,涌现了超过100个贡献者,并且有超过150个项目和超过1000个产品开始使用docker。

最有意思的事情是,在docker本身还没有稳定之前,就有如RedHat和AWS这样的公司为其提供官方支持,很多开发者和公司就急不可耐的把它用到生产环境,连docker自己的CEO都要跳出来劝说大家稍安勿躁,我们还没有准备好嘞。在整个IT软件发展历史中,好像很少有这种情况,特别是这种企业级运维相关的系统,一般大家都是慎之又慎,为何这次如此不谨慎,如此不认真,如此不负责任把还在beta阶段的系统上线运行?

我记得2014年8月,这时距离docker发布仅仅1年的时间,我与湖南某家大型媒体的研发中心交流,开发人员已经在使用docker运行他们的系统,而且有些已经进入生产环境。而在过去的2年里,每一个我所接触的客户,从C-level的管理人员,到中层管理者,到开发人员都在提这个东西。

它到底是什么?这可能是每一个IT从业者都想搞明白的问题。

Docker是什么?容器又是什么?

Docker 直译:码头工人。是在码头上搬运货物的工人
容器 英文:Container,如果再翻译回来就有2个不同的释义:集装箱/容器。

如果按照这世界上大多数正常人的理解,大家会把 Docker(码头工人)和 Container (集装箱)这一对事物放在一起,他们的关系一目了然:码头工人搬运集装箱。但是如果按照这世界上另外的一类人(程序员)的理解,我们会这样组合 ,Docker (代码集装箱搬运工)和 Container (容器)。

Docker与容器是完全2个不同的东西,Docker是用来组装/搬运/拆包容器的工具。当然也可以是人,我们原来这些苦逼的程序员谁没干过zip/copy/paste/unzip的工作呢?其实Docker就是这样一个工具,用来打包 (build)/传送(push/pull)/拆包 (run) 那些需要运行的应用。而容器就是那个包。

那么容器又是什么?

其实和集装箱很类似,就是把那些需要放在一起从A地运送到B地运行的,不能和其他程序混杂的代码封装成的一个包而已。这个概念从计算机出现的那天基本上就存在了,只是这么多年我们一直在不停的改进,但从来没有一个像docker这样的工具让容器的使用变的如此简单。在Unix/Linux的世界里,它曾将叫做 Process Container,现在被称为Control Group (cGroup);在Windows世界里,我们曾经有组件。他们的目的都一样,为了把程序从A地运送到B地,同时确保他们可以相互隔离的运行。

Docker绝对不等同于容器。一个是干活的人,一个是被搬运的物品,能一样吗?但是我仍然在各种技术文章,会议演讲上看到和听到将他们混为一谈的说法。实在觉得需要给他们正名,也是今天写这个文章的主要原因。

Docker,容器与虚拟机有啥区别?

在每一篇介绍Docker的文章里面都会看到与虚拟机比较的内容,其实我觉得这完全是拿苹果和香蕉比较,它们完全不具备可比性,至少在技术上!
大家为啥要这样比较,主要目的是让那些不了解IT但是却在管理IT的人(对,就是你的领导和你的客户)理解为啥他们好不容易,花了n多钱建立起了虚拟化平台/私有云,现在还要再花钱搞容器,搞docker。对的,这纯粹是个市场行为,与技术无关,因为他们在技术上不具备可比性。
惯常的说法,容器启动迅速(对,它只需要加载那些当前应用的进程)虚拟机启动缓慢(废话,它要加载一堆和应用无关的进程好吗)。你试试把100个应用打包到一个容器里面然后启动它,估计你一定会被98%的Windows用户打败。
给你一个hyper-v, vmware, kvm你跑不了容器,你还是需要在上面启动虚拟机,然后才能运行容器。就好像你要在家里提供100个品类的菜单,然后让你儿子每天回来点餐,给他个沙漏,然后说你随便点,我保证在10分钟内上菜。你当你是谢霆锋呢?人家谢大厨后面有10个帮厨,10个采购,10个餐厅经理,10个服务员,做的菜都是提前腌制的。你就算有三头六臂也只能说:臣妾做不到啊!
所以,容器之所以快,是把每次都要启动操作系统的操作预先完成了,这样只需要启动应用本身而已。而且,容器不会比直接启动一个应用快,甚至还会更慢一点。

然并卵,那我要这七十二变有何用?

牢骚发够了,还是说说Docker到底有啥用?Docker这个搬运工与其他搬运工不同的是,他在组装容器的时候会把应用需要的其他配件都放在一个集装箱里。这样,集装箱到货以后,直接开包就可以完成应用组装;不用再到其他地方七拼八凑的去找各种配件了。这就好比你想做红烧肉,原来的应用打包只给你打包了肉(应用),别的什么八角,香叶,冰糖,生抽老抽(应用依赖环境)都不带;现在商家提供一站式服务,一个包里不光有肉,还有七七八八所有的东西。你家里有炉子,有锅就够了(操作系统)。
另外,Docker厉害的地方在于,它不光提供了这些配料,还把物流给你搞定了。我们现在可以直接向商家(Docker Hub)下单,商家送货上门(Docker Pull),你准备好炉子和锅(操作系统),直接下锅(Docker Run),菜就上桌喽。

最后,用一句话定义Docker,那就是:优化应用运维过程的工具和生态系统。

晚上吃红烧肉!祝大家胃口好!


相关资料:


请关注微信公众号 【devopshub】,获取更多关于DevOps研发运维一体化的信息

Docker,容器,虚拟机和红烧肉的更多相关文章

  1. 为什么Docker比虚拟机快?

    1.Docker有着比虚拟机更少的抽象层,由于Docker不需要Hypervisor实现硬件资源虚拟化,运行在Docker容器上的程序直接使用的都是实际物理机的硬件资源,因此在Cpu.内存利用率上Do ...

  2. docker容器介绍

                       Docker容器 一.什么是Docker? Docker时Docker.Lnc公司开源的一个基于LXC技术之上搭建的Container容器引擎,源代码托管在Git ...

  3. 三文搞懂学会Docker容器技术(上)

    1,Docker简介 1.1 Docker是什么? Docker官网: https://www.docker.com/ Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2. ...

  4. 在Windows宿主机中连接虚拟机中的Docker容器

    1. 简单拓扑图

  5. Windows连接Linux虚拟机里面的Docker容器

    一.Windows.Linux虚拟机.docker关系图 如果此时在Windows宿主机中pingDocker容器是ping不同的,因为在宿主机上没有通往172.17.0.0/24网络的路由,宿主机会 ...

  6. 问题:宿主机访问不到虚拟机内的docker容器

    问题描述:初学Docker,主机Windows 10,虚拟机Cent OS7 运行了一个docker容器(Tomcat7),宿主机无法访问容器运行的服务. 问题原因:宿主机无法访问docker容器ip ...

  7. Docker:虚拟机挂起后,再启动docker容器连接失败

    问题描述 当我们使用VMware15 Pro 创建虚拟机并运行Linux搭建的Docker时,挂起虚拟机后再次运行发现访问Docker容器失败. 解决方式  我们正常的挂起其实是:挂起客户机,博主尝试 ...

  8. Docker容器和虚拟机区别

    Docker .虚拟机之间区别 虚拟机技术的缺点: 1.资源占用太多 2.冗余步骤多 3.启动很慢 容器化技术 1.服务器资源利用率高 2.比较轻量化 3.打包镜像测试,一键运行 比较Docker和虚 ...

  9. docker——容器安装tomcat

    写在前面: 继续docker的学习,学习了docker的基本常用命令之后,我在docker上安装jdk,tomcat两个基本的java web工具,这里对操作流程记录一下. 软件准备: 1.jdk-7 ...

  10. 理解Docker(4):Docker 容器使用 cgroups 限制资源使用

    本系列文章将介绍Docker的有关知识: (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 ...

随机推荐

  1. my97datepicker开始日期小于结束日期格式化时间精确届时分秒

    my97datepicker开始日期小于结束日期格式化时间精确到时分秒 一 , 需求: 结束时间 > 开始时间, 不符合的时间段不能选择.比如我选择开始日期是7月28,那结束的日期将只能从7月2 ...

  2. Struts2--默认Action

    何时使用:  访问的网页不存在, 显示错误页面, 或者显示主页. 有时存在一种情况, 就是找不到对应action 可以在struts.xml里设置一个默认的action <?xml versio ...

  3. 水流(water)

    水流(water) 题目描述 全球气候变暖,小镇A面临水灾,于是你必须买一些泵把水抽走.泵的抽水能力可以认为是无穷大,但你必须把泵放在合适的位置,从而能使所有的水能流到泵里.小镇可以认为是N×M的矩阵 ...

  4. PHP 页面缓冲函数

    1.flush:刷新缓冲区的内容,输出.函数格式:flush()说明:这个函数经常使用,效率很高.2.ob_start :打开输出缓冲区函数格式:void ob_start(void)说明:当缓冲区激 ...

  5. hibernate--ID生成策略--XML

    xml生成id, a) generator b) 常用4个: native, uuid, identity, sequence 1. 新建java项目,  引入hibernate, junit(use ...

  6. JavaScriptConvert.SerializeObject转换出错

    The length of the string exceeds the value set on the maxJsonLength property(字符串的长度超过maxjsonlength上设 ...

  7. 【转】2015年薪酬大涨的15个IT岗位

    近日,国外科技 IT 招聘公司 Robert Half 分析了 70 个科技职位后发现 2015 年从事 IT 从业人员的平均起薪将攀升至 5.7%,其中 15 个职位的提升潜力最大. 当企业在招聘过 ...

  8. td文字过长部分显示,鼠标移动显示全部内容

    只要在该td中加上title属性,鼠标移到这里就会看到全部内容, 在td中加上div,属性设置如下,就能显示宽度为200px的内容,大于则隐藏.代码如下: <td title="我是代 ...

  9. cocoaPods的安装使用 以及 Carthage

    http://cnbin.github.io/blog/2015/05/25/cocoapods-an-zhuang-he-shi-yong/ 按照这个步骤就OK Note:当引入已有的project ...

  10. object 类 toString() 和 equals() 的覆写

    基本作用: objiect类是所有类的父类. 任何一个类定义的时候如果没有明确定义了父类的话,默认父类是Object类. class A extends Object{} 在整个java里面,类的继承 ...