当前位置: 首页 > 科技观察

Docker的价值和应用场景分析

时间:2023-03-18 20:28:37 科技观察

近几年,Docker在IT行业非常火爆。在各大技术论坛上引起了很大的关注,公司内外也有相当多的介绍和尝试。看起来,这么高的技术,似乎会在云、服务部署、运维等领域带来颠覆性的创新。最近查阅了一些文档,对Docker的技术细节有了更深入的了解,发现Docker确实能恰到好处地解决一些需求,但绝对不是万能的。1.Docker的官方定义是什么:Develop,ShipandRunAnyApplication,AnywhereDocker是一个供开发者和系统管理员开发、发布和运行应用程序的平台。Docker使您可以从组件快速组装应用程序,并消除了运输代码时可能出现的摩擦。Docker让您可以尽快测试代码并将其部署到生产环境中。解读:Docker官方定义为应用打包部署的平台,不是虚拟化技术;Docker本身没有革命性的创新,它的核心是Container,Container是多年前提出的概念,在Linux、Unix、FreeBSD上都有技术实现。Linux的成熟解决方案是lxc;Docker是基于lxc(linux容器)和cgroup的上层工具,通过对lxc、cgroup及相关系统命令的封装,使得用户可以非常方便的使用LinuxContainer;DockerHub提供了应用程序包的版本管理和分发能力。2.Docker的价值及同类技术对比Container的核心价值在于隔离和封装。这两个方面有很多类似的解决方案。下面简单分析比较一下:1.隔离Docker的隔离是通过Container实现的,是基于Lxc的;与此对应的另一个解决方案是虚拟化。两者对比如下:优点:非常轻量级相对于创建或启动虚拟机,Container可以认为是没有开销的,大约相当于在Linux下创建一个进程;有一种夸张的说法:单机可以轻松启动上千个Container,但启动上千个虚拟机基本不可能;但是这个比较的前提是单机需要隔离1000个应用;如果只需要隔离两个应用程序,每个应用程序运行500个进程,则比较应该是两个容器和两个VM。缺点:(1)隔离级别高。Docker独立于Linux内核之上。准确的说是进程之间的隔离。这就决定了:Docker只支持64位Linux,肯定不支持windows、unix、bsd……,而虚拟化可以支持所有主流操作系统;Docker是隔离在内核之上的,本身依赖于内核的特性,所以只能模拟一个高层次的Linux发行版;你一定不能找到像ubuntu9.04这样的镜像;Container使用的Kernel与宿主机的Kernel一致,Container的内核不能自定义。(2)硬件资源计量和配额能力通过cgroups,Docker对Container资源的使用有一定的控制能力,但在网络、磁盘、CPU使用率方面,计量和隔离能力不如VM成熟;另外,从用户的角度来看,VM可以非常透明,可以直接理解为主机;但是Container在网络连接和数据存储方面需要特殊处理。因此,与虚拟化相比,从隔离的角度来看,Docker的优点是性能损失小,缺点是隔离级别高。如果你的需求是在单机上尽量隔离,那么Doc??ker是首选。如果你的需求是尽可能完全隔离,对硬件资源进行精确控制和衡量,对隔离副本数要求不高,那么虚拟化是首选。2、封装从Docker的Logo和官方定义来看,其主要能力不是隔离,而是封装,即应用的打包、部署和运行。封装上的优势主要体现在:(1)与VM相比,封装体积真的很小。Centos官方镜像只有220M左右(已经缩减为最基本的Centos,而且没有ifconfig命令,安装常用工具后你会发现不小)。(2)应用可以高度定制和打包。可以通过Dockerfile定义应用程序包。镜像中的部署可以高度定制和打包。对外接口收敛清晰;用户无需注意细节。(3)镜像仓库和版本管理在公有和私有仓库的搭建和使用,以及版本管理方面都非常成熟,可以很方便的通过仓库进行共享、分发和部署。(4)应用与操作分离我们看到的图像是静态的、只读的;镜像运行后成为容器,运行时的修改只影响当前容器,不影响镜像。由上可知,与VMImage的部署能力相比,Docker设计理念先进,优势明显,几乎没有劣势。但从打包部署的角度来看,Docker的竞品应该不是VM,而是RPM+YUM、DEB+APT的组合。#p#你会发现,与这两个组合相比,能力惊人的相似,但还是有一些区别:(1)打包能力:Docker的Image可以轻松在Centos上运行Ubuntu,而且非常轻量级。它在Rpm和Deb中不可用;这在一些测试、学习或者小规模的PaaS场景中是非常有价值的;但对于任何更大规模的应用程序,我认为这样的部署是不太可能的。(2)封装粒度和依赖管理:Docker从内核封装在一起,包括Linux用户环境、系统类库、应用程序;可以理解为一个DockerImage对外依赖的只是LinuxKernel;另一方面大大提高了便携性;Rpm和Deb的打包粒度比Docker更细,只打包单个应用本身,只记录外部依赖不保存在包中,使用apt、yum等辅助工具也很容易解决外部依赖;这样做的好处是比较轻,理论上包体积肯定比Docker小;大规模业务部署下,千台设备发布20MRPM,发布200MDocker镜像,效率更高,差距应该还是比较大的;在实际应用中,在解决外部依赖问题上,C/C++程序也可以简单地通过静态链接实现;Java/PHP/GoLang等程序基本没有系统类库依赖,跨平台的能力也胜过Docker本身。(3)跨平台:在所有主要的Linux发行版下,都可以使用Docker以同样的方式管理打包和部署;但是Rpm和Deb有自己的粉丝和发行版本,这在发行版中并不常见;但是Docker自身的学习和部署成本要高于Rpm和Deb。因此,从封装的角度来说,Docker远胜于VM,具有Rpm+Yum&Deb+Apt的能力。从用户的角度来看,它多了一种选择。抛开隔离不谈,假设你需要在单机上运行一个MySQL,你是否想安装Docker,然后使用Docker部署MySQL?还是直接yuminstallmysql?总的来说,Docker的核心价值在于隔离和封装,两者之间有很好的平衡。可以预见,它是小规模PaaS领域的最佳解决方案。3、对Docker在公司应用的思考前面提到,Docker的核心价值在于隔离和封装。讨论Docker在公司业务中的应用也要从这两个方面考虑。哪些场景可以使用隔离:研发测试流程,单机多版本并行部署运行;公司内部类PaaS服务,如TDW计算、蓝鲸;海量服务的正式环境,基本上单个服务可以单机运行,可以说完全没有隔离要求。哪些场景使用封装:公司所有业务都需要打包部署,但是每个主要业务都已经有非常成熟的打包发布体系;具备研发、编译、测试、发布以及架构、配置、路由等一体化能力;如果基于Docker重构现有的包发布系统,开发和用户学习成本相当高,但没有明显的技术价值。如果是新开发的技术框架和运维系统,Docker会是更好的选择,但个人更喜欢Centos+Yum+RPM的组合。4、其他IT技术日新月异,新的技术和组件层出不穷。使用Docker必然要求基础运行环境与业界保持同步。为了跟上行业的步伐,技术团队在没有任何业务输出的情况下,仍然需要花费大量的精力在工作上。