您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码:  验证码,看不清楚?请点击刷新验证码 必填



  求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
 
   
 
 
     
   
 订阅
  捐助
Docker,云时代的程序交付方式
 
作者 肖德时,火龙果软件    发布于 2014-11-07
  2730  次浏览      19
 

Docker — 云时代的程序分发方式

要说最近一年云计算业界有什么大事件?Google Compute Engine的正式发布?Azure入华?还是AWS落地中国?留在每个人大脑中的印象可能各不相同,但要是让笔者来排名的话那么Docker绝对应该算是第一位的。 如果你之前听说过它的话,那么也许你会说“没错,就是它”,因为几乎世界各地的开发、运维都在谈论着Docker;如果你还没听说过Docker,那么我 真的建议你花上10分钟来阅读本文。

1. Docker简介

1.1. 什么是Docker?

Docker是一个重新定义了程序开发测试、交付和部署过程的开放平台。Docker也是容器技术的一种,它运行于Linux宿主机之上,每个运行 的容器都是相互隔离的,也被称为轻量级虚拟技术或容器型虚拟技术。而且它有点类似Java的编译一次,到处运行,Docker则可以称为构建一次,在各种 平台上运行,包括本地服务器和云主机等(Build once,run anywhere)。

容器就是集装箱,我们的代码都被打包到集装箱里;Docker就是搬运工,帮你把应用运输到世界各地,而且是超高速。

Docker是开源软件,代码托管在GitHub上,使用Go语言编写。Go可以称得上是互联网时代专门为开发分布式、高并发系统而生的编程语言。Docker也可以说是Go语言的一个杀手级应用,而且在Docker生态圈里很多软件也都是使用Go语言编写的。

1.2. Docker历史

Docker项目始于2013年3月,由当时的PaaS服务提供商dotCloud开发,dotClound也是YCombinator S10的毕业生。尽管Docker项目很年轻,到现在也只有15个月而已,然而它的发展势头如此之猛已经让很多人感叹不已了。

2013年10月dotCloud公司名字也由dotCloud, Inc.改为Docker, Inc.,集中更多的精力放到了Docker相关的研发上。

1.3. Docker的技术基石

在进入Docker的世界之前,我们先来看一下Docker实现所依赖的一些技术。

实际上Docker的出现离不开很多Linux kernel提供的功能,甚至可以说Docker在技术上并没有什么特别重大的创新之处,利用的都是已经非常成熟的Linux技术而已,这些技术早在 Solaris 10或Linux Kernel 2.6的时候就有了。可以毫不夸张的说Docker就是“站在了巨人的肩膀上”。

下面我们就先来了解一下Docker主要利用的Linux技术。

1.3.1. 容器技术

容器(Container)有时候也被称为操作系统级虚拟化,以区别传统的Hypervisor虚拟技术。它不对硬件进行模拟,只是作为普通进程运行于宿主机的内核之上。

在容器中运行的一般都是一个简易版的Linux系统,有root用户权限、init系统(采用LXC容器的情况下)、进程id、用户id以及网络属性。

容器技术在云计算时代已经被大量使用。Google公司的Joe Beda在今年5月做了一次题为《Containers At Scale — At Google, the Google Cloud Platform and Beyond》注 1的演讲,在其中提到“Everything at Google runs in a container”,每周启动容器次数竟然多达20亿次。

注 1 https://speakerdeck.com/jbeda/containers-at-scale

很多PaaS平台都是基于容器技术实现的,比如目前最成功的PaaS平台Heroku。此外,还有比较著名的开源PaaS平台Cloud Foundry的Warden以及Google的Lmctfy(Let Me Contain That For You)注 2等。

注 2 Let Me Contain That For You,http://github.com/google/lmctfy

1.3.2. LXC

这也是在Linux下使用比较广泛的容器方案。基本上我们可以认为Linux containers = cgroups(资源控制) + namespaces(容器隔离)。

LXC很成熟很强大,然而它却不好使用,比如它不方便在多台机器间移动,不方便创建管理,不可重复操作,也不方便共享等等,相对于开发人员来说,它只是系统管理员的玩具。Docker的出现很好的解决了这些问题,它将容器技术的使用成本拉低到了一个平民价格。

1.3.3. namespaces

这是用来为容器提供进程隔离的技术,每个容器都有自己的命名空间,比如pid/net/ipc/mnt/uts等命名空间,以及为容器提供不同的hostname。namespace能保证不同的容器之间不会相互影响,每个容器都像是一个独立运行着的OS一样。

1.3.4. cgroups

cgroups是一个Google贡献的项目,它主要用来对共享资源的分配、限制、审计及管理,比如它可以为每个容器分配CPU、内存以及blkio等的使用限额等。cgroups使得容器能在宿主机上能友好的相处,并公平的分配资源以及杜绝资源滥用的潜在风险。

容器技术实现方案可以用下面的图进行简单说明。

图1 Docker如何和Linux内核打交道

上图中的cgroups、namespaces和apparmor等都是Linux内核提供的功能。不管是传统的LXC还是Docker的libcontainer,都使用了Kernel的这些功能来实现容器功能。

1.3.5. 联合文件系统

联合文件系统是一个分层的轻量、高性能文件系统。Docker之所以这么吸引人,很大程度上在于其在镜像管理上所做出的创新。而联合文件系统正是构建Docker镜像的基础。

AUFS(AnotherUnionFS)是一个分层的基于Copy On Write技术的文件系统,支持Union Mount,就是将具有不同文件夹结构的镜像层进行叠加挂载,让它们看上去就像是一个文件系统那样。

1.4. 容器技术VS虚拟机技术

容器技术和Hypervisor技术虽然不属于同一层次的概念,但是作为具有计算能力的应用运行载体来说,它们还是有一定的共通性和竞争关系,这里作此对比完全是为了加深读者对容器技术的理解而已。

比如开源PaaS实现软件tsuru最初使用的是基于虚拟机的技术,创建一个应用程序需要5分钟左右的时间,而在采用Docker之后,已经将这个时间缩短到了10秒钟了注 3。

注 3 tsuru and docker by Andrews Medina https://speakerdeck.com/andrewsmedina/tsuru-and-docker

1.5. 我们能用Docker干什么?

Docker可以应用在各种场景下,比如公司内部开发测试使用,或者作为共有或者私有PaaS平台等。

现在PaaS平台的发展已经非常成熟了,这里我们只罗列一些在开发中使用Docker技术可能会给我们带来的益处。

1.5.1 在开发中

构建开发环境变得简单

简单包括几个方面的意思

1.快速:只需docker run即可

2.共享:通过Dockerfile或者Registry

3.自动化:一切代码化的东西都可以自动化

4.统一:每个人的开发环境都是一模一样的

设想我们要基于Nginx/PHP、MySQL和Redis开发,我们可以创建3个Docker镜像保存到公司私有的Registry中去,每个开发人员使用的时候是需要执行docker run redis即可以享用自己独有的Redis服务了,而且这3个容器不管从占用磁盘空间还是运行性能来说,都比虚拟机要好很多。

1.5.2. 在测试中

解决环境构建问题

有时候构建测试的环境是一项费时费力的工作,而Docker能让这变得轻松。如果你的测试比较简单的话,甚至直接拿开发构建的镜像就可以开始了。

消除环境不一致导致的问题

“在我的机器上运行的好好的,怎么到你那里就不行了?”,我想超过半数的程序员都曾经说过类似的话。如果对导致这一问题的原因进行统计的话,我想排在第一位的应该非“环境不一致”莫属了,这包括操作系统和软件的版本、环境变量、文件路径等。

使用Docker的话你再也不用为此烦恼了。因为你交付的东西不光是你的代码、配置文件、数据库定义,还包括你的应用程序运行的环境:OS加上各种中间件、类库 + 你的应用程序。

1.5.3. 部署和运维

基于容器的部署和自动化

Docker定义了重新打包程序的方法。

Docker容器 + 用户应用 = 部署单位(构件)

Docker可以看作是用代码编写出来的国际集装箱,它可以把任何应用及相关依赖项打包成一个轻量、可移植(Portable)、自包涵的容器。

以前部署代码都是代码级别的,有了Docker,则可以进行容器级别的部署。这样带来的最大的好处就是开发者本地测试、CI服务器测试、测试人员测试,以及生产环境运行的都可以是同一个Docker镜像。

快速进行横向扩展

Docker容器的启动速度很快,可以瞬间启动大量容器,所以在非常适合在业务高峰期进行横向扩展。这比传统的启动EC2实例或者物理机可要快多了。

天生的和云计算技术相结合

当然,由于Docker具有很好的移植性,所以它更强大的地方还在于和云环境结合使用。

Docker容器是可移植,或者说跨平台。将来的应用部署可能是在本地进行打包(成Docker镜像)然后传送到云端运行,至于是AWS还是GCE 这不是问题,Docker都能在其上运行。这样不仅能在一定程度上解决vendor-lockin的问题,同时也使得在不同的云服务提供商之间迁移也变得 简单。尤其是未来在使用多云(multi-cloud)环境的时候,这将非常便利。

笔者认为基于IaaS + 容器技术的应用交付、部署方式将来一定会成为一种流行的方式。

进行Blue-green部署

「Blue-green deployment」这个词最初出现在《Continuous Delivery: Reliable Software Releases through Build, Test, and Deployment Automation 》一书,后经ThoughtWorks的Martin Fowler发扬光大注 4。

注 4 http://martinfowler.com/bliki/BlueGreenDeployment.html

Blue-green deployment方法其实很简单,就是保持两套一样的生产环境,而实际上只有一套环境真正的对外提供服务(图中绿色环境),而另一套环境则处于待机状 态(图中蓝色)。部署的时候,我们会先上线到蓝色环境中,如果测试没有问题了,再将路由切换到新的服务上。

Blue-green部署能带来如下好处。

1.最小化停机时间

2.快速回滚

3.hot standby

而未来的开发和部署和可能就会像下面这样进行了。

1.① 开发人员将代码push到Git仓库

2.② CI工具通过webhook得到最新代码,构建Docker镜像并启动容器进行测试。

3.③ 测试通过后将镜像打标签后push到私有镜像Registry

4.④ CI工具通知CD工具

5.⑤ CD工具通过Mesos/Marathon等进行基于容器的部署

6.⑥ 测试没有问题后进行容器的切换(即Blue-green切换)

   
2730 次浏览       19
 
相关文章

云计算的架构
对云计算服务模型
云计算核心技术剖析
了解云计算的漏洞
 
相关文档

云计算简介
云计算简介与云安全
下一代网络计算--云计算
软浅析云计算
 
相关课程

云计算原理与应用
云计算应用与开发
CMMI体系与实践
基于CMMI标准的软件质量保证
最新活动计划
软件架构设计方法、案例与实践 8-23[特惠]
Linux内核编程及设备驱动 8-15[北京]
Python、数据分析与机器学习 8-23[特惠]
嵌入式软件架构设计 8-22[线上]
QT应用开发 9-5[北京]

专家视角看IT与架构
软件架构设计
面向服务体系架构和业务组件的思考
人人网移动开发架构
架构腐化之谜
谈平台即服务PaaS
更多...   
相关培训课程

云计算原理与应用
Windows Azure 云计算应用

摩托罗拉 云平台的构建与应用
通用公司GE Docker原理与实践
某研发中心 Openstack实践
知名电子公司 云平台架构与应用
某电力行业 基于云平台构建云服务
云计算与Windows Azure培训
北京 云计算原理与应用