20171220 转载知乎 docker 有什么优势 (自悟至少是运维的革命)

作者:小狐濡尾

链接:https://www.zhihu.com/question/22871084/answer/88293837

来源:知乎

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

#难懂的docker学术式定义

Docker is an open-source project that automates the deployment of applications inside software containers, by providing an additional layer of abstraction and automation of operating-system-level virtualization on Linux. Docker uses the resource isolation features of the Linux kernel such as cgroups and kernel namespaces, and a union-capable filesystem such as aufs and others to allow independent “containers” to run within a single Linux instance, avoiding the overhead of starting and maintaining virtual machines.

Docker是一个开放源代码软件项目,让应用程序布署在软件容器下的工作可以自动化进行,借此在Linux操作系统上,提供一个额外的软件抽象层,以及操作系统层虚拟化的自动管理机制。Docker利用Linux核心中的资源分离机制,例如cgroups,以及Linux核心命名空间(name space),来建立独立的软件容器(containers)。这可以在单一Linux实体下运作,避免启动一个虚拟机器造成的额外负担。

——摘自维基百科

这个定义真是学院派的不能再学院派了,一般人通过这个充满专业名词的定义,模糊的能知道docker是可以实现简化部署之类功能的虚拟化工具,但是并不能清楚的理解它到底牛逼在什么地方。

##如何搞懂一个陌生的概念?

要搞明白docker的概念,只看定义是远远不够的。除了直接看定义外,还可以通过其他方式来认识它,主要有三种:

第一种:在长期使用docker的过程中,逐渐体会到其优势(放到具体场景中认识)

第二种:通过和一些已经熟悉的概念对比来认识(比如虚拟机)

上述两种方法都要求掌握相当多的软件虚拟化知识,但是对于一个从未接触过docker,甚至对部署都不是很了解,也没时间去研究docker的新人,应该怎么快速理解docker的核心优势呢?

第三种:借助于隐喻。

如果你不清楚隐喻的概念,个人有一篇文章单独介绍:隐喻。如果不想了解,可以将隐喻简单理解为类比,借助于另一个更容易认识的概念来映射新概念。

#docker的隐喻

「docker」的字面意思是「码头工人」,这个名字本身应该是官方深思熟虑之后的结果,这个词汇本身就带有很强的隐喻性质,它借用了一个在真实世界中已经成熟的体系:全球物流系统,来映射docker在软件领域中起到的作用。

在全球物流系统中,一个非常重要的发明就是集装箱。

##集装箱重要在哪里?

为了理解这件事情,可以先考察一下集装箱出现之前的物流情况:货物从工厂生产出来之后装箱,然后一箱箱的搬到卡车上,然后再一箱箱卸下来,一箱箱送上火车,运送到码头附近的火车站,再一箱箱卸下来,装上卡车,拉到货轮上,再一箱一箱的装上去…

可以看出在这个整个流程中,大量的时间,人力 ,物力全部浪费在了中间的装卸上。在物流系统里面,由于路程和运输工具速度的限制,货物真正在路上的时间是一定的,在交通技术得到改善之前,这个时间也很难去缩短。于是这部分货物装卸时间就成了物流系统中的瓶颈。

这个瓶颈在集装箱出现之后得到了很大的改善。集装箱重要在它提供了一种通用的封装货物的标准规格(尺寸,外形符合统一标准),这样就产生了一些巨大的优点:只需要在运输前一次性封装,集装箱就可以放上火车,卡车,拉到码头,直接放在货船上;卸船之后直接再放上火车,卡车,运送到目的地。而且由于集装箱符合统一标准,整个流程非常容易机械化,这引发了以集装箱为中心的整个全球物流的标准化进程,从而节省了大量的时间资源和人力资源,成本迅速下降,促进了全球资源的流动与重新配置。

##docker(码头工人)正是借用了集装箱的隐喻

docker就像往集装箱里装货物的码头工人那样,它把应用打包成具有某种标准规格的集装箱,用计算机领域的语言来说,这种按照一定规格封装的集装箱叫「镜像」。其实就是将你原来的代码添加点额外的内容,格式之类的,生产出来的一个符合某种标准的东西。

集装箱减少了货物的运输工作量,那docker镜像又有什么相似的优势呢?同样可以先看看docker出现之前的应用部署是情况。

###docker出现之前的部署情况

在docker出现之前,比如说要部署一个django应用,要做哪些事情?

首先得有个python环境,比如这个要部署的应用基于python3,而你机器上是python2,那ok,先装个python3吧,一看装起来还挺麻烦,要先装各种依赖,还要解决一些可能的冲突,没办法硬着头皮上吧。

装完python之后,因为有pip这些神奇的工具,很快就装完django及各种需要的python库了。咦,发现还要装mysql,还用了redis。没办法,继续下载,安装,配置。费了九牛二虎之力终于搞完了。一天就这么过去了。

啥?你告诉我原来的服务器不用了,要换一台服务器?我靠,那重新来一遍吧,有了昨天的经验,只用了大半天就搞定了。

啥?你说咱们的应用做的太好,要进行推广,需要指导其他厂商部署?我选择狗带,删代码走人

上面的描述可能有些夸张,但也绝不是罕有发生。在docker出现之前,各种安装、配置环境正是运维人员经常做的事情之一,在重复工作上浪费了巨大的资源。

###docker出现之后

####标准的交付件

说到docker最像集装箱的地方,关键就是理解它是软件领域的一种「标准化」,这种标准化的具体产物,简单来说就是「镜像(image)」。

「镜像」这个词说实话太玄乎,当然对应的原文「image」本身也挺玄乎的。原因是它根据一些场景引申了本来的含义。

image本身是「画像,映像」的意思,又有「现实物体的抽象描绘」的意思,而且画像本身可以很容易的复制,后来又有了「原画像复制品」一类的意思。

再后来直接就拿来表示光盘镜像(很容易复制的存储影像的东西,只不过画像是画在纸上,但这种影像以数字形式存在于光盘上)。

当然「镜像」在汉语中就有「复制品」的含义,只不过加入了汉字独有的意境,显得玄乎,朦胧了。

在docker中镜像是指,把你的应用按照一定的格式封装(其实就是执行一些符合特定规的命令行)成一种具有某种标准规格的东西(就像集装箱把你的货物封装起来类似)。形象的说,就是把你的应用按照一定的格式抽象的画了个画像。

在docker中,镜像是无法直接运行的,我猜想这并不是技术上的原因,而是出于工程设计上的考虑。因为一般来说,一个软件的某个具体版本只会打包成一个镜像。如果镜像可以配置,运行的话,在使用过程中很可能会对镜像造成破坏。

那怎么样避免镜像损坏的问题呢?就是再加一层,相当于分身术,只要本尊没问题,分身怎么扑街都不会真正的跪掉。多加的这一层分身,就叫容器(container),这个名字也挺形象,它就像个盒子一样,你的应用在里面运行,而且多了一层安全机制。你想使用服务或把你的应用跑起来的话,只需要使用镜像新创建一个容器就可以了(也是一条命令搞定),而镜像还放在那里不动,没办法,金贵嘛。

#### Docker 究竟做了什么简化?

docker在部署过程中,将安装,配置等重复的部分,由docker自动化完成。只需要在第一次部署时,构建完可用的docker镜像(装好集装箱),在以后使用中,短短的几行命令,就可以直接拉取镜像,根据这个镜像创建出一个容器,把服务跑起来了。所需要的仅仅是安装了docker的服务器,一个Dockerfile文件,以及比较流畅的网络而已。真可谓『一次构建,到处部署』。

需要python3环境?直接 from python:3.x 搞定。

需要迁移服务器? 直接把应用连带Dockerfile,备份数据拷贝到新服务器上,几条命令又搞定

需要作为服务给别人使用?Dockerfile即是最清晰的部署文档,维护一个官方镜像即可,谁需要就直接拉下来几条命令部署上就行了。

到这里你可能已经发现了,docker镜像成为了一种像集装箱那样的标准货件。它不像传统的软件交付方式那样,只把代码以及说明文档之类的给你就完了,而是直接给你一个标准docker货件,它可能是Dockerfile,或者直接就是镜像,这个标准件不仅包括了代码本身,还包括了代码运行的OS等各种整体环境。

于是,谁想用我的服务,直接拉取镜像,实例化一个容器就可以了,能直接提供你所要的服务,不再像之前那样有繁复的安装过程————这些都有人给你做过了。

#### 当然docker的优点不止于此

就像集装箱带来的「标准化」,这种标准化不仅是指集装箱本身,而且是指包括运输器械,物流管理方法等在内的,整个领域的标准化和效率的提高。也就是说基于一件核心事物的「标准化」,可以做更多的事情,比如集装箱的机械自动搬运,再远的比如自行车上的螺丝,轮胎等都有全球通用的标准。

docker也是类似的,一旦这种软件标准建立起来之后,就可以基于标准件和相应的管理方式带来更多的改变。随便举一些例子:

##### 统一的管理服务

使用docker部署的应用,都会在docker的管理范围之内。这也是docker的另一个非常大的优点,它提供了一种隔离的空间,把服务器上的零散的部署应用集中起来进行管理。

举个例子,比如我一个服务器上部署了n多服务,有mysql,redis,rabbitmq,其他还有一堆应用。有一天我服务器突然断电重启了,那些没有设置自动重启的应用,那些重启出问题的应用,那些你甚至都不知道隐藏在某个角落里的重要应用没启动成功….

然而使用docker,一眼就可以看出那些应用正常启动了,那些应用又出问题了。接下来只用有条不紊的处理就ok了。

#####持续交付上的应用持续交付有一些超出范围,自己去寻找答案吧

##### 弹性计算

也就是根据需要,动态地添加新的应用服务,在不需要时收回服务器资源,docker的标准化让这种弹性能力得到了更好的应用。

# 最后,关于docker的一个误解

很多人说docker改变了运维世界,这句话是从群体统计角度来说的,像mysql,python这样被大规模使用的应用,docker化之后对整个群体所节省的时间,是非常巨大的。

所以有人可能会问,我只有一台服务器,也不太可能会迁移。我的python服务,mysql服务,只需要部署一次,就可以在以后重复使用了。那这样docker对于我来说还有优势吗?毕竟docker也是有学习成本的。

如果你确信你的应用都是一次性的,而且只提供给自己使用,那么docker在这种场景下的优势不是特别明显:即便是docker,最初的构建也是需要有人做的,这和直接在机器上部署一次的工作量差不多。也就是说,docker并不能把部署的工作「减少为0」,比较好的情况下是「基本减少为1」。

但是,你真的真的确信,你所做的工作只是一次性的吗?

编辑于 2017-03-27

557​63 条评论

​分享

​收藏​感谢收起

韦易笑

用户标识

游戏开发、编程、程序员话题的优秀回答者

284 人赞同了该回答

前两天,debian 从 8 全新升级到 9(不喜欢 dist-upgrade),要重装 owncloud (debian 9 已经移除 apt源了),打开 owncloud 的安装文档,真他妈的琐碎,要搭建个高可用的 owncloud 起码还要费我两三个小时,于是打开http://hub.docker.com立马就找到了一个 owncloud 的 image,我扫了一眼特性,比 owncloud 官方推荐的标准配置强不少:

StreamlinedLet's Encryptfunctionality built right in

This will fetch valid, trusted and free SSL certs for your domain and install them into the image!

Hurray for green lock icons!

Superfast

Uses PHP7 with APCu and Zend OpCache for maximum performance

Now withimage version tagscorresponding to OwnCloud release versions

So you won't get unexpectedly upgraded and you can safely stay on an OC version you know is working for you

Built in (optional) MySQL database server (faster than sqlite default)

Or specify your own pre-existing database server during setup

Web GUI driven initial setup of user/password/database

Based on Arch Linux ensuringeverythingis cutting edge & up to date

SSL (HTTPS) encryption works out-of-the-box

Tweaked for maximum security while maintaining compatibility

Optionally enable automatic SSL certificate regeneration at runtime for maximum security

Or easily incorporate your own SSL certificates

In-browser document viewing and editing ready (.odt, .doc, and .docx)

In-browser media viewing ready (pretty much everything I think)

Comes complete with all of the official ownCloud apps pre-installed:

Bookmarks

Calendar

Contacts

Documents

Gallery

Or install your own 3rd party apps

随便装一下 owncloud糊弄一下的话,很快,但想弄的稳定高效,不是专业sa,每项都要费我不少时间去查阅文档,真不想在这些事情上费时间。看完这些毫不犹豫的把 image 拉下来,设置下内外端口映射和文件夹映射,一条命令就跑起来了,感觉真爽。

以前在大公司,要什么环境发封邮件就行了,后来在小公司,不得不充当半个 SA才感觉事情之繁琐细致。举个例子,搭建 svn server,可能你觉得简单,不就是 apt-get subversion 然后 supervisor 里面配置个 svnserve 的服务就行了么?好,接下来要给 svn 换成 https 的模式可能你就觉得有点烦了,apt-get 下来还有一堆权限和模块要配置,起码半小时,不过还好;如果更进一步,需要针对 ssd 优化 svn 仓库的存储方式,还有每天定时增量备份,每周定期全量备份,备份内容要保存到远程目录,加密压缩,定期删除老的备份保留最近两个月数据,然后支持多仓库,自动同步权限配置并合并更新,有个小网页可以注册svn帐号(需要管理员密码才能操作),可以复位忘记密码的,所有帐号操作有记录,你可能真的要吐血了。

这种环境我搭了四遍,每次都是隔了半年以上忘记的差不多了,又重头开始塔的,第一次完整搭建下来废了我两天。本来偷懒没记笔记,想着搞一次,结果半年后第二次又来一遍,好多东西忘记了,仍然费了我一个整天,还好我这次学乖了记了笔记,第三次第四次半天就搞定了。

现在你再让我搭建一遍我真的想想都怕,后来我搭建了一个干净的 svn虚拟机 image,但是接近1个G,压缩以后也好几百兆,十分累赘,不便于保存和传递,现在好了,制作一个 docker 映像,交给别人用,根本不用啰嗦半天,一条命令,前面配置了那么多的功能,一下就启动起来了。

在我半个 SA生涯里,https + svn 只能算烦,不能算复杂,比较复杂的还有整套 qemu-kvm 的虚拟化环境,linux 物理机上从零搭建起一套类似 vmware 的可视化虚拟环境,可以在网页上点点创建虚拟机,设置虚拟网络,支持网页版 VNC,可以页面上打开虚拟机终端屏幕进行操作系统安装,就像腾讯云阿里云一样,还有一些自动脚本可以用 libvirt 操作虚拟机做一些自动备份迁移的事情。配这么一套环境要想弄得完善,各种网络和系统参数优化到位,从头到尾接近一百多个步骤,这玩意儿,我配第一次挺开心,觉得自己从头到尾弄了一套完全免费的 vmware,结果后面又接着配了俩三次,配一次吐一升血。

除此之外还有各种 mongodb 集群啦,分布式文件系统啊,有了docker以后,都是一句话就搞定的事情。现在觉得 docker 就是来拯救大家的时间的,能够将 SA的经验标准化并固定下来,特别中小团队,上了docker省下你一两个 sa来一点问题都没有。

编辑于 2017-06-29

284​37 条评论

​分享

​收藏​感谢收起

知乎用户

Engineer@Docker Inc.

23 人赞同了该回答

1. Docker是一个对Linux cgroup, namespace....包装并提供便利借口的的一个开源项目,使其看起来可以更像“虚拟机”

2. 实现更轻量级的虚拟化,方便快速部署

3. 感觉 对开发的影响不大,但对于部署来说,是场革命。可以极大的减少部署的时间成本和人力成本

发布于 2014-05-31

23​1 条评论

​分享

​收藏​感谢

知乎用户

程序员

6 人赞同了该回答

Docker有不少有趣的功能,通过本教程系列相信你会更好地理解它们。Docker特性主要包括以下几点,具体参考:http://dockerone.com/article/101

速度飞快以及优雅的隔离框架

物美价廉

CPU/内存的低消耗

快速开/关机

跨云计算基础架构

发布于 2015-01-28

6​添加评论

​分享

​收藏​感谢

新新云里

15 人赞同了该回答

给个标准答案,不用谢:

1)标准化应用发布,docker容器包含了运行环境和可执行程序,可以跨平台和主机使用;

2)节约时间,快速部署和启动,VM启动一般是分钟级,docker容器启动是秒级;

3)方便构建基于SOA架构或微服务架构的系统,通过服务编排,更好的松耦合;

4)节约成本,以前一个虚拟机至少需要几个G的磁盘空间,docker容器可以减少到MB级;

5)方便持续集成,通过与代码进行关联使持续集成非常方便;

6)可以作为集群系统的轻量主机或节点,在IaaS平台上,已经出现了CaaS,通过容器替代原来的主机。

再透露一些信息,以便对docker了解更多一些,国内做docker容器的公司现在不多,都有免费试用的服务,如果你感兴趣可以一家一家去玩玩儿,精灵云、道云、时速云、灵雀云等,这四家我都已经玩儿了一遍。

发布于 2016-04-22

15​添加评论

​分享

​收藏​感谢

吉志龙

喜欢游泳和深蹲的程序员

Docker最大的优势是其定义的镜像(image)制作和分发机制,以及基于镜像衍生出来的一套软件生态:

简单的Dockerfile语法,飞快的镜像制作速度,让稍懂命令行的开发者能很快上手制作自己的镜像。

镜像继承(FROM )和镜像中心(docker registry),使得镜像复用异常奇松。

基于镜像的发布,让发布过程原子化。以前一次升降级=拉代码包+更新配置+杀进程+起进程,换一种语言意味着换一种发布流程。基于镜像的升降级=拉镜像+停容器+起容器,和语言几乎无关。

http://hub.docker.com上各种镜像让各路开发者只需要通过一条命令`docker run`即可轻松尝试新的技术。

反倒是镜像的运行时-容器(container),还存在很多不完美的地方,使得企业级应用的容器化部署之路远没有官方宣称的“ship and run"那么简单,让很多其他容器技术试图取而代之或占领细分市场(如rkt, hyper,mesos container等),这些技术虽在容器运行时层面各有侧重,但不变的是他们都会强调兼容docker 镜像。

编辑于 2017-06-27

0​1 条评论

​分享

​收藏​感谢

xdays

a DevOps

24 人赞同了该回答

楼上回答的很好了。

关于部署,我再补充一句:

传统的部署模式是:安装(包管理工具或者源码包编译)->配置->运行;

Docker的部署模式是:复制->运行。

发布于 2014-06-04

24​9 条评论

​分享

​收藏​感谢

XU FUNG

11 人赞同了该回答

docker:运维大神! 举起手来, 把你在那黑盒子里所干的事情统统坦白!

rooter: 好吧,这是一份 Dockerfile...

你可能感兴趣的:(20171220 转载知乎 docker 有什么优势 (自悟至少是运维的革命))