这就是 docker 的实质: 穿着马甲的标准化 。docker 的发明人根据自己运维 PaaS 平台的经验,重新思考了自己的工作, 将PaaS 平台的 devops 工作从各个角度标准化了一下,将系统底层实现的 cgroup、namespace、aufs|device mapper 等技术集成在一个使用镜像方式发布的工具中,于是形成了 docker 。

关于 Docker 是什么,有个闻名的隐喻: 集装箱 。可是它却起了个“ 码头工人”(docker 的英文翻译)的姓名。这无疑给运用者许多暗示:“快来用吧!用了 docker,就像国际呈现了集装箱,这样你的事务就能够随意的、自由自在的运转在任何地方(Docker 公司的标语: Build,Ship,and Run Any App,Anywhere ),所以码头工人就底子都能够下岗了。”可是人们往往疏忽了一个问题,隐喻的优点是便利人了解一个不简略了解的概念,但并不能解说其概念自身。

什么是 Docker?(什么是docker容器)  Docker Linux 第1张

互联网技能职业的一大特色是,这儿的绝大多数事物并不像实际生活那么详细,在这个职业中咱们所触摸的绝大多数概念都是笼统的、不详细的。所以实际生活中许多可笑的作业在互联网技能职业就不只变的不可笑,反而或许很严厉。就比方,实际生活中你是简直不或许看见两个神经正常的成年人争辩究竟是锤子更好仍是螺丝刀更好这个问题的。而在咱们这个职业,你能够很简略的被卷进究竟是 java 好?仍是 php 好?仍是 js 好?或许相似的 言语之争 中。当然除了言语,其它的软件东西之争也举目皆是,比方经典的还有 vim vs emacs。

由于不详细和笼统,就需求隐喻来给出资人解说其价值,究竟出资人大多数是外行嘛。至于 docker 究竟是“集装箱”仍是“码头工人”并不重要,即便这两个概念本质上抵触了都不重要,很少有人会去真的考虑 集装箱的呈现导致码头工人简直绝迹 。只需能让咱们了解 docker 是个重要的、有价值的、划时代的东西,骗到出资人的钱就足够了。也很少有出资人去讲究集装箱的发明人究竟有没有因而赚到钱?以及为什么没赚到钱?只需概念能忽悠人就行了。当然这个概念趁便也忽悠了一切懒得考虑的技能工程师。

吐了一大段槽之后,回到咱们的正题,docker 究竟是什么?已然咱们喜爱集装箱这个隐喻,那么咱们也无妨先来看看集装箱的本质。咱们应该底子都了解集装箱是怎样改动国际的吧?在集装箱之前,货品运送没有共同的规范方法进行转移,所以铁路、公路、海洋等各种运送之间,需求很多的人力作为货品中转,功率极低,而且本钱很高。集装箱呈现之后,国际上绝大多数的货品运送都能够放到这个奇特的箱子里,然后在公路、铁路、海洋等一切运送场景下,这个箱子都能够不必改动形状直接能够承运,而且中心的中转作业,都能够通过大型机械搞定,功率大大进步。从此全球化开端,商业的潜力被进一步发掘……牛逼之处我就不多说了,可是这个箱子为什么这么奇特呢?答案其实也就在上面的描绘中,无非便是两个字: 规范 。

是的! 规范!规范!规范! 重要的作业说三遍。

由于规范了集装箱的巨细和尺度的规范规范,所以相应的船只、货车、列车才干依照规范制造出来使联运成为或许,一切的运送中转的主动化东西才干被规划制作出来而且高效的运用,才干够极大的进步功率,进步主动化水平,以至于码头工人才会赋闲。集装箱自身是一个产品,而这个产品无非便是“规范化”的这个概念穿上了马甲,马甲能够有红的、绿的、蓝的、花的,可是巨细规范有必要都相同。实际国际中的实际清楚明晰,便是这么简略。那么 docker 呢?

依照这个思路,docker 其实跟集装箱相同,或许说它想跟集装箱相同,成为穿戴马甲的“规范化”。这样开发工程师就能够把它们开发出来的 bug 们放到“集装箱”里,然后运维人员就能够运用规范化的操作东西去运维这些心爱的 bug 们。所以完结了“海陆联运”,就好像运维工程师底子不需求了解其运维的软件架构,而开发工程师也并不需求了解其软件运转的操作系共同样……

这便是 docker 的本质: 穿戴马甲的规范化 。docker 的发明人依据自己运维 PaaS 渠道的阅历,从头考虑了自己的作业, 将PaaS 渠道的 devops 作业从各个视点规范化了一下,将体系底层完结的 cgroup、namespace、aufs|device mapper 等技能集成在一个运用镜像方法发布的东西中,所以构成了 docker 。调查 docker 构成的考虑进程,其实便是作者针对他所运维的场景如何做主动化运维的考虑,咱们能够拜见其讲演的 PPT 。这个讲演的姓名就跟主动化运维相关: Docker: automation for the rest of us 。那么 docker 的本质是什么?在我看来便是个针对 PaaS 渠道的主动化运维东西罢了。众所周知(当然假如你不知道,那么我来告知你): 主动化运维的大前提便是规范化 。

假如你正好是一个运维工程师,而且你正感觉你的运维环境一团糟,费事请你考虑一下这是为什么?你是不是正在运维着一个运用 php、java、C# 乃至 C/C++ 等用各种言语编写的运用都在运转的环境里?这个环境是不是由于某种前史原因,使你的操作体系运转着各个版别的内核,乃至还有 windows?即便是相同言语编写的事务也运转着不同版别的库?你的整个体系环境是不是乃至找不出来两台硬件、操作体系、库版别以及言语版别彻底相同的环境?所以你每次遇到问题都要去排查究竟那个坑究竟在那里?从网络、内核到运用逻辑。你每次遇到产品晋级都要在各种环境上做稳定性测验,发现不同的环境代码 crash 的原因都不尽相同。你就像一个老中医相同去阅历各种疑难杂症,假如遇到问题能找到原因乃至都是走运的,绝大多数状况是处理了但不知道原因,和没处理主动好了也不知道原因。所以你们在一个特定的公司的环境中积累着“阅历”,成为你们组新手眼中的大神,凭仗历经毛病养成的条件反射在快速处理不断发生的重复问题,并虚张声势的说:这便是作业阅历。 由于阅历经常是搞不清楚原因时的***一个遮羞布 。当他人诉苦你们部分功率低的时分,你一般的反应是:”you can you up,no can no BB!“

我花了这么多唇舌吐槽运维,无非便是想提示咱们” 运维规范化的重要性 “这一显而不易见的实际。规范化了,才干进步功率。规范化了,才干依据规范建造归于你们体系的主动化运维。那么咱们再来看看 docker 是怎样做的?

首要, 规范化就要有规范化的文档规范 ,要界说体系软件版别等一系列内容。规范好了之后,咱们开端施行。可是在长时间运维的进程中,很或许呈现跟着体系的开展,文档内容现已过期了,工程师又来不及更新文档的问题。怎样处理?docker 给出的答案是: 用 dockerfile 。dockerfile 便是你的文档,而且用来发生镜像。要改动 docker 镜像中的环境,先改 dockerfile,用它发生镜像就行了,确保文档和环境共同。那么实际是,有多少在运用 docker 的人是这样用的?你们是不是嫌这样费事,所以爽性直接在线 docker commit 发生镜像,让文档跟现场环境又不符了?或许我仍是太抱负,由于你们压根连文档都没有?

其次, 规范化要有对运用共同操作的方法 。在实际中,即便你用的是 php 开发的运用,发动的方法都或许不尽相同。有用apache 的,有用 nginx 的,还有用某种不知名 web 容器的,乃至是自己开发 web 容器的。假如操作规模扩大到包括 java 等其它言语,或数据库等其它服务,那么操作方法更是千奇百怪。尽管 UNIX 操作体系早就对此作了共同的规范,便是咱们常见的把发动脚本放到 /etc/rc.d 中,SYSV 规范中乃至规则了发动脚本该怎样写,应该有哪些方法。可是绝大多数人不知道,或许知道了也不这么做,他们习惯用 ./start 作为自己事务发动的唯一规范。乃至 ./ 是哪个目录或许都记不住。所以 docker 又给出了处理方案:我压根不论你怎样发动,你自己爱咋来咋来,咱们用 docker start 或 run 作为共同规范。所以 docker start 能够发动一个 apache、nginx、jvm、mysql 等等。有人病垢 docker 的规划,质疑它为什么规划上一个容器内只给发动一个进程?这便是原因:人家压根不是为了给你当虚拟机用的,人家是为了给发动出产环境的进程做规范化的!

第三, 为了保护出产环境的共同性和装备改动的幂等,docker 发明性的运用了相似 git 办理代码的方法对环境镜像进行办理 。所以:

你想做库版别晋级吗?更新个镜像吧!

你想做 php、java 的版别晋级吗?更新个镜像吧。

好便利!太爽了!

等等……神马?你想改动 apache 装备文件中的一个字段?做个新镜像晋级吧!你的 php 代码写错了一行要改个 bug?做个新镜像晋级吧……

在一群人吐血三升之后,所以有人出了个主见。唉,其实后两种需求没必要这么费事,有一种软件叫做 puppet、chef、salt、ansible、rsync ……

所以咱们要在 docker 中发动一个 puppet。什么?你要用 ansible?好吧,咱们来看看怎样在 docker 中发动一个 sshd?我有个计划使命要跑,起个 crontab 能够么?

你的 docker 是不是就这么变成了“虚拟机”的?

不过请注意:我并不是说 docker 欠好,仅仅你是否真的评价了它规范化的方法是不是适宜你的事务场景?锤子是用来砸钉子的,可是你非要用它来砸手指,我也没什么方法。

作为一个工程师,而且是受过专业练习的工程师,总是想规划出一套东西满意一切场景需求。由于工程师所受的思想练习是:你越是处理了更遍及的问题,你所发明的价值就越大。可是请搞清楚,这个使命一般是由规范委员会来完结的,每个工程职业都会有这么个安排来做这件作业。当然,不扫除商业公司的产品能够深刻影响规范拟定的状况。那么咱们这些工程师***的价值是什么?摆正自己的方位,看清自己的问题,帮小组地点的企业进一步进步功率,进步竞争力。每个企业都有其前史和当时特色,就运维作业来讲,依据企业的实际状况找到其规范化的最经济有利方法才是咱们这些受聘任的职业工程师的中心价值。软件选型要要量体裁衣,而不是跟风炒作。当然,假如你的中心价值是想要站在“技能前沿”,计划一向***技能潮流,做一个出没于各大技能交流会的新技能吹嘘逼者,并以此抬高自己身价的话,那我的话自然是对你不适用的。(说这话或许会开罪许多人,我要解说一下:关于那些真挚的想要共享自己技能,期望为社区开展做奉献的人,我是怀着深深的敬意的!谢谢你们!)对待新技能,大多数工程师的状况是:测验是为了上线的,测验出的问题都是要处理的而不是用来评价的,不上线就没有作业效果。我以为工程师对待新技能应有得情绪是:急进的用新技能新方法来做线下测验,仔细的总结评价测验流程和成果和现有环境的异同,保存慎重的评价决议计划新技能是否在事务上大规模运用。

docker 是银弹么?真的能像集装箱那样改动国际么?我的观点当然不是。即便集装箱,也不能处理一些特别的运送问题,比方大型飞机零部件的运送,或许小件零星产品的运送。假如说云核算职业真的要呈现集装箱的话,那么首要这个职业要被几大云核算厂商分割结束,商场老练之后才有或许。为什么?由于让一个运用能够在任何地方跑的需求,首要应该来自云的用户,他们或许为了稳定性考虑既租用了阿某云,又租用了腾讯云(纯广告,自己地点的公司,所以请勿吐槽),还或许为了海外商场还用了某马逊云。这时用户会有需求说,我想要这些云的环境规范共同,以便我的运用能够在哪朵云上都能跑(Build,Ship,and Run Any App)。而现在,云核算商场刚刚起步,群雄逐鹿,正是差异化开展抢夺用户的时分。出了云核算厂商外,其它公司的 IT 环境都不相同,规范化要求也就不或许相同。那么你觉得 docker 这个规范或许适宜一切人么?

假如你用过了 docker,而且还觉得它十分适宜你的环境,那么我期望你能答复这几个问题:

你的 docker 是用 dockerfile 发生的镜像仍是直接 docker commit?

你的 docker 里边跑了多少个进程?

你的 docker 是当虚拟机用的么?

那么你用的是 docker 么?

***,送咱们一个段子,期望能博你一笑。

工程师:“嘿!有人发明晰一个叫做集装箱的东西,这东西必定能够使运送本钱大大下降!乃至改动国际!”

用户:“好振奋!这东西能够运送我的波音787客机么?“

工程师:“额。。不能整个运,需求拆开再运,由于咱们要契合集装箱的规范……”

用户:“那这东西能够运送我的空客380嘛?”

工程师:“额。。咱们评论的是同一件作业。”

用户:“不可是嘛?那不能改造一下集装箱让它能够运嘛?”

工程师:“额。。。这不只仅是咱们的问题,要抵达运送目的地还要通过铁路,公路,他们或许也无法……”

用户:“真的不能改造集装箱么?可这东西是今后的开展方向啊!未来的国际都是应该是集装箱运送的!”

工程师:“额……”

老板:“嗯!这东西说不定真的是未来的开展方向!咱们必定要完结用集装箱运送这些飞机!工程师们,你们赶忙去霸占这些技能难题,提前能够完结咱们用户的特别需求!让集装箱能够到达咱们的事务要求!快去吧!加油啊!”

工程师:“额……”

转载请说明出处
知优网 » 什么是 Docker?(什么是docker容器)

发表评论

您需要后才能发表评论