对Docker的价值和应用场景分析

近年来,Docker在IT界可谓风光十足,各大技术论坛上赚足了眼球,公司内外也有至关多的介绍和尝试,看上去如此高大上的技术,貌似会给云、服务部署、运维等领域带来颠覆性的创新。mysql

近期查阅了一些文档,较深刻的了解Docker的技术细节,发现Docker确实在解决部分需求时恰到好处,但也绝对不是无所不能的万金油。linux

 

1、什么是Dockersql

官方定义:docker

Develop, Ship and Run Any Application, Anywhereubuntu

Docker is a platform for developers and sysadmins to develop, ship, and run applications. Docker lets you quickly assemble applications from components and eliminates the friction that can come when shipping code. Docker lets you get your code tested and deployed into production as fast as possible.windows

 

解读:网络

官方把Docker定义为应用打包、部署的平台,而不是虚拟化技术;架构

Docker自己并无革命性的创新,其核心是Container,Container是不少年前就提出来的理念,而且在Linux、Unix、 FreeBSD上都有技术实现,Linux成熟的方案是lxc;app

Docker是一个基于lxc(linux container),以及cgroup的上层工具,经过对lxc,cgroup及相关系统命令的封装,使得用户能够很是方便的使用Linux Container;框架

Docker Hub提供了应用包的版本管理和分发能力;

 

2、Docker的价值及同类技术对比

Container的核心价值在于隔离性和封装性,在这两方面也有较多相似解决方案,简单分析和对比一下:

 

1. 隔离性

Docker的隔离性是经过Container来实现的,而且是基于Lxc;与此相对应的另一个解决方案是虚拟化;二者对好比下:

优势:

很是轻量

与建立或启动一个虚拟机相比,Container能够认为没啥开销,约等于Linux下建立一个进程;

有个夸张的说法:单机能够轻易的启动多达上千个Container,但基本不太可能启动上千个虚拟机;

但这比较的前提是须要在单机上隔离1000个应用;若是只需隔离两个应用,每一个应用运行500个进程的话,对比应该是两个Container与两个VM;

缺点:

隔离层次高

docker在Linux kernel之上进行隔离,确切的讲是进程间的隔离,这就决定了:

1)Docker只支持64位Linux,必然不支持windows, unix, bsd...,而虚拟化可支持全部主流操做系统;

2)Docker隔离在kernel之上,而且自己依赖于kernel的特性,因此只能模拟出高版本的Linux发行版;必然找不到ubuntu 9.04这样的image;

3) Container使用的Kernel与主机的Kernel是一致的,没法定制Container的内核;

硬件资源度量和配额能力

经过cgroup,Docker具有必定的能力控制Container的资源使用,但在网络、磁盘、CPU的使用上,度量和隔离能力尚未VM成熟;

此外,从用户角度来看,VM能够作到很是透明,能够直接理解为一台主机;但Container在网络链接、数据存储方面都须要通过特殊处理;

 

因此,与虚拟化相比,从隔离性上看,Docker的优点在于性能损耗低,劣势在于隔离层次比较高;

若是你的需求在是单机上进行尽量多的隔离,那Docker是首选;

若是你的需求是尽量完全的隔离,对硬件资源精准控制且可度量,同时对隔离份数要求很少的话,那虚拟化是首选;

 

2. 封装性

从Docker的Logo以及官方的定义来看,它的主要能力并不在隔离性,而在于封装性,也就是应用的打包、部署、运行;

 

在封装方面的优点,主要体如今:

封装大小

   与VM相比,Docker的image确实很小,官方的Centos image大概只有220M(被精减成最基本的Centos了,连ifconfig命令都没有,安装完经常使用工具,你会发现也不小了);

可对应用高度定制和封装

   可经过Dockerfile定义应用包,Image内的部署可高度定制和封装,对外接口收敛且清晰;使用者无需关注细节;

Image仓库及版本管理

   很是成熟的公共和私有仓库搭建和使用,以及版本管理,并可通地仓库很容易的进行共享、分发、部署;

应用和运行分离

   咱们所看到的Image是静止的,只读的;将image运行起来后是Container了,在运行时的修改,只影响当前Container,不影响Image;

 

从上面能够看出,与VM Image的部署能力相比,Docker设计理念先进,优点明显,并且几乎没有啥缺点。

 

但从封装部署角度来看,Docker的竞品应该不是VM,而是RPM+YUM,DEB+APT这样的组合。

你会发现,与这两组合相比,能力出奇的类似了,但仍是有些区别:

 

封装能力:

Docker的Image,能够轻易实如今Centos上面跑Ubuntu,并且很是轻量,这个是Rpm,Deb不具有的;

这个在一些测试、学习、或小规模的Paas场景下,是很是有价值的;

但任何较大规模的应用,我想不太可能出现这样的部署;

封装粒度及依赖管理:

Docker自kernel之上,全打包在一块了,里面包含了Linux用户环境、系统类库、应用程序;能够理解为,一个Docker Image的外部依赖只有Linux Kernel了;从另一方面看,极大提高了移植能力;

Rpm、Deb的打包粒度比Docker更细,只打包单个应用自身,外部依赖经过只记录并不存储在包内,经过apt,yum这样的辅助工具也很是容易解决外部依赖;这样作的好处在于更轻量,理论上包大小确定小于Docker;在大规模业务部署下,上千台设备发布20M的RPM,与发布200M的Docker image,效率上的差距应该仍是比较大的;

实际应用当中,在解决外部依赖问题上,C/C++程序还能够简单的经过静态连接来实现;Java/PHP/GoLang这类程序基本不存在系统类库的依赖,跨平台的能力也赛过Docker自己;

跨平台:

在各大Linux发行版下,你均可以按相同的方式使用Docker来管理打包及部署;但Rpm,Deb都有本身的粉丝和发行版本,在发行版间不通用;

但Docker自身的学习和部署成本,要高于Rpm,Deb;

因此,从封装性看,Docker远胜于VM,与Rpm+Yum&Deb+Apt能力至关,从用户角度来看是多了一个选择;

 

抛开隔离性,假设你须要在单机上运行一个MySQL,你是但愿安装Docker、再用Docker来部署MySQL?仍是直接yum install mysql?

 

综合来看,Docker的核心价值就在于隔离性和封装性,并在二者间有个很好的平衡和兼顾,可预见的是在小规模的Paas领域是最好的解决方案。

 

3、Docker在公司内应用的思考

前面讲到Docker的核心价值在于隔离性和封装性,讨论Docker在公司内业务的应用也应该从这两个方面来看。

哪些场景能够用到隔离性:

研发测试流程,单机多版本并行部署和运行;

公司内部的类Paas服务,好比TDW计算、蓝鲸;

海量服务的正式环境,基本单个服务就能跑满单机,能够说彻底没有隔离性需求;

哪些场景用到封装性:

公司全部业务都须要打包部署,但各大业务都已经有很是成熟的包发布系统;整合研发、编译、测试、发布以及架构、配置、路由等各方面的能力;推倒现有包发布系统,基于Docker重构的话,开发和用户学习成本至关高,但技术上并无明显价值。

若是是全新开发的技术框架和运维体系的话,Docker会是一个较好的选择,但我的更倾向于Centos+Yum+RPM的组合。

 

4、其它

IT技术突飞猛进,新技术和组件层出不穷,相似Docker之类的使用势必要求基础运营环境与业界保持同步更新。

为了能保持与业界同步,技术团队仍需花费巨大精力投入到无任何业务产出的工做当中。

免费领取兄弟连IT教育原创linux运维工程师视频/细说linux教程,详情咨询官网客服:http://www.lampbrother.net/linux/

或者勾搭Q2430675018

欢迎加入linux交流群 478068715

相关文章
相关标签/搜索