关于Docker,你要知道的都在这了

来源:互联网 发布:影楼美工设计教程 编辑:程序博客网 时间:2024/06/10 03:05

转自:
https://mp.weixin.qq.com/s?__biz=MjM5NzAyNDUwOQ==&mid=2649245871&idx=1&sn=276221e104dabf400b4409db902d1bc4&chksm=befcaf3d898b262b98c2c634f4661ec20430dbf07c3d281ff013f95335f672ff6377f61d497c&scene=38#wechat_redirect

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

——摘自维基百科

 

Docker技术一直很火,因为它可以实现快速部署。但我们真的了解Docker吗?它有什么优势?具体应用场景在哪里?看看知乎上各路大神的回答。


Docker有什么优势?

Docker出现之后


  • 标准的交付件


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


以上答案作者:小狐濡尾
链接:https://www.zhihu.com/question/22871084/answer/88293837
来源:知乎


Docker的应用场景在哪里?

八个Docker的真实应用场景


  • 简化配置


这是Docker公司宣传的Docker的主要使用场景。虚拟机的最大好处是能在你的硬件设施上运行各种配置不一样的平台(软件、系统),Docker在降低额外开销的情况下提供了同样的功能。它能让你将运行环境和配置放在代码中然后部署,同一个Docker的配置可以在不同的环境中使用,这样就降低了硬件要求和应用环境之间耦合度。


  • 代码流水线(Code Pipeline)管理


前一个场景对于管理代码的流水线起到了很大的帮助。代码从开发者的机器到最终在生产环境上的部署,需要经过很多的中间环境。而每一个中间环境都有自己微小的差别,Docker给应用提供了一个从开发到上线均一致的环境,让代码的流水线变得简单不少。


  • 提高开发效率


这就带来了一些额外的好处:Docker能提升开发者的开发效率。


不同的开发环境中,我们都想把两件事做好。一是我们想让开发环境尽量贴近生产环境,二是我们想快速搭建开发环境。


理想状态中,要达到第一个目标,我们需要将每一个服务都跑在独立的虚拟机中以便监控生产环境中服务的运行状态。然而,我们却不想每次都需要网络连接,每次重新编译的时候远程连接上去特别麻烦。这就是Docker做的特别好的地方,开发环境的机器通常内存比较小,之前使用虚拟的时候,我们经常需要为开发环境的机器加内存,而现在Docker可以轻易的让几十个服务在Docker中跑起来。


  • 隔离应用


有很多种原因会让你选择在一个机器上运行不同的应用,比如之前提到的提高开发效率的场景等。


我们经常需要考虑两点,一是因为要降低成本而进行服务器整合,二是将一个整体式的应用拆分成松耦合的单个服务(译者注:微服务架构)。如果你想了解为什么松耦合的应用这么重要,请参考Steve Yege的这篇论文,文中将Google和亚马逊做了比较。


  • 整合服务器


正如通过虚拟机来整合多个应用,Docker隔离应用的能力使得Docker可以整合多个服务器以降低成本。由于没有多个操作系统的内存占用,以及能在多个实例之间共享没有使用的内存,Docker可以比虚拟机提供更好的服务器整合解决方案。


  • 调试能力Docker


提供了很多的工具,这些工具不一定只是针对容器,但是却适用于容器。它们提供了很多的功能,包括可以为容器设置检查点、设置版本和查看两个容器之间的差别,这些特性可以帮助调试Bug。你可以在《Docker拯救世界》的文章中找到这一点的例证。


  • 多租户环境


另外一个Docker有意思的使用场景是在多租户的应用中,它可以避免关键应用的重写。我们一个特别的关于这个场景的例子是为IoT(译者注:物联网)的应用开发一个快速、易用的多租户环境。这种多租户的基本代码非常复杂,很难处理,重新规划这样一个应用不但消耗时间,也浪费金钱。


使用Docker,可以为每一个租户的应用层的多个实例创建隔离的环境,这不仅简单而且成本低廉,当然这一切得益于Docker环境的启动速度和其高效的diff命令。


  • 快速部署


在虚拟机之前,引入新的硬件资源需要消耗几天的时间。Docker的虚拟化技术将这个时间降到了几分钟,Docker只是创建一个容器进程而无需启动操作系统,这个过程只需要秒级的时间。这正是Google和Facebook都看重的特性。


你可以在数据中心创建销毁资源而无需担心重新启动带来的开销。通常数据中心的资源利用率只有30%,通过使用Docker并进行有效的资源分配可以提高资源的利用率。

 

以上答案作者:知乎用户
链接:https://www.zhihu.com/question/22969309/answer/38317063
来源:知乎



阅读全文
0 0
原创粉丝点击