设为首页收藏本站

LUPA开源社区

 找回密码
 注册
文章 帖子 博客
LUPA开源社区 首页 业界资讯 开源资讯 查看内容

Docker:现在和未来

2014-12-3 14:33| 发布者: joejoe0332| 查看: 3870| 评论: 0|原作者: 张晓鹏|来自: InfoQ

摘要: Docker是一种Linux容器工具集,它是为“构建(build)、交付(ship)和运行(运行)”分布式应用而设计的。作为DotCloud公司的开源项目,其首发版本的时间是2013年的3月份。该项目很快就受到欢迎,这也使得DotCloud ...
  Docker – 迄今为止的故事

 

  Docker是一种Linux容器工具集,它是为“构建(build)、交付(ship)和运行(运行)”分布式应用而设计的。作为DotCloud公司的开源项目,其首发版本的时间是2013年的3月份。该项目很快就受到欢迎,这也使得DotCloud公司将其品牌改为Docker(并最终将其原有的PaaS业务出售而专注在Docker上)。Docker 1.0在2014年6月发布,而且延续了之前每月发布一个版本的节奏。


 


  其1.0版本标志着Docker公司认为Docker平台已经足够成熟,并可以被应用到产品中(公司及其合作伙伴们还提供了一些需要付费的支持选项)。每月的版本更新显示出该项目仍在快速发展,比如增加新的特性,解决发现的问题。这个项目成功地将“交付”和“运行”解耦,这样源自任意Docker版本的镜像都可以和其它任意不同版本一起工作(前向和后向均可兼容),这就为Docker应用提供了稳定的基础,以应对快速的变化。


  Docker发展成最受欢迎的开源项目可能会被人看作是一种炒作,但其实这个结果还是有坚实的基础来支撑的。Docker吸引了业界众多知名大牌厂家的支持,其中包括亚马逊(Amazon)、Canonical、CenturyLink、谷歌(Google)、IBM、 Microsoft、New Relic、Pivotal、Red Hat和VMware,这使得只要在有Linux的地方,Docker就几乎随处可用。除了这些大厂家,许多初创企业也围绕着Docker来发展,或是将它们的发展方向和Docker更好地结合起来。所有这些合作伙伴(或大或小)驱动着核心项目和周边生态系统的快速发展。

 

Docker技术的简要综述

  Docker利用了一些Linux核心工具,比如cGruops、命名空间和SELinux来支撑容器之间的隔离。起初Docker只是LXC容器管理子系统的前端,但它在0.9版本中引入了libcontainer,这个原生的Go语言库提供了用户空间和内核之间的接口。


  Docker容器是基于联合文件系统(union file system)的,比如AUFS,利用它可以跨多个容器来共享一些组件,如操作系统镜像和安装的库文件。这种分层的方式也被Dockerfile DevOps工具充分利用,这可以缓存那些已经成功完成的操作。这就省掉了那些安装操作系统和应用程序依赖文件的时间,大幅度加速了测试周期。另外,在容器之间共享库还能减少内存的占用。


  Docker容器是从镜像开始的,镜像可以是本地创建的、本地缓存的,或者是从注册库中下载的。Docker公司运营着DockerHub公有注册库,上面有官方的数据仓库,是为不同的操作系统、中间件和数据库而创建的。组织和个人可以在Docker Hub上发布镜像的公有库,也可以将其注册成私有库。由于上传的镜像文件可以包含任何东西,所以Docker Hub提供了一种自动构建工具(之前被称为“可信的构建”),镜像构建于一个Dockerfile,它作为镜像内容的清单。

 

容器和虚拟机的对比

  Docker容器要比虚拟机有效率的多,这是因为它们可以共享内核和相关的库。同样的原因,容器所占用的内存也要比虚拟机少得多,虽然虚拟机利用了RAM的过度承诺技术(RAM overcommitment)。容器也减少了对存储的占用,因为部署的容器会共享镜像的底层。IBM的Boden Russel已经做了一个基准测试(benchmarking)来对比两者的不同。


  容器也表现出比虚拟机更低的系统负载,所以同样的应用,在容器中相比在虚拟机中,性能通常会相当或者更好。IBM的研究者团队发布了一个虚拟机和Linux容器性能对比的报告可以参考。


  容器只是在隔离特性上要比虚拟机差,虚拟机可以使用ring-1特权的硬件隔离技术,如Intel的VT-d and VT-x。这种隔离技术可以防止虚拟机破出(breaking out)和彼此交互。容器没有任何形式的硬件隔离,这使得它容易受到漏洞的利用。从Shocker(可对Docker进行概念攻击)的验证来看,Docker 1.0之前的版本都是很脆弱的。尽管利用Shocker,Docker在1.0版本中修复了一些特定的问题,但Docker的CTO Solomon Hykes仍然表示:“当我们感觉可以轻松地宣称Docker打开箱(out-of-the-box)可以安全容纳非受信的uid0程序(译者注: root和超级用户权限)时,我们一定会明言相告”。Hykes的话从另一方面承认仍然存在一些其他的漏洞和相关的风险,在容器变得可靠之前还有很多工作要做。


  对于许多用户案例,在容器和虚拟机二者之间选择其一是种错误的二分法。Docker可以在虚拟机中运行地很好,这可以让它应用在已有的虚拟化框架中,如私有云和公有云。同样也有可能在容器中运行虚拟机,这有点像谷歌在它的云平台中使用容器的方式。只要IaaS得到广泛应用,并可按需提供虚拟机服务,那么就有理由期待未来数年容器和虚拟机的应用可以并存。还有一种可能,即将容器管理和虚拟化技术进行融合以提供一种两全其美的方法:所以硬件信任锚微虚拟化实现支撑libcontainer能够与Docker的工具链和生态系统的前端进行集成,而使用不同的提供了更好隔离性的后端。微虚拟技术(类似于Bromium的 vSentry和VMware的 Project Fargo)已经应用到桌面环境中为应用提供基于硬件的隔离,所以相同的方法可以使用到libcontainer上,作为Linux核心容器机制的替代技术。


“容器化”的应用

  几乎所有的Linux应用都可以运行在Docker容器里,并且对编程语言或架构的选择没有任何的限制。实际上仅有的限制在于从操作系统的角度来看容器被允许做什么。即使如此,也可以通过在特权模式下运行容器来降低限制,以大幅度地减少受到的控制(与此对应的是装载到容器里的应用风险增加,并可能会导致对主机操作系统的损坏。)


  容器从镜像开始,反过来镜像也可以从运行的容器中得到。从本质上说有两种方法可以把应用置入到容器中-手动和Dockerfile。


手动构建

  手动构建从启动一个基础操作系统的容器开始,然后通过交互式终端,用所选Linux相关的包管理器安装应用程序及其依赖项(dependencies)。Zef Hemel在他的文章“使用Linux容器以支持便捷的应用部署”中提供了这个过程的细致描述。一旦应用完成安装,新的容器就可以推送到注册库(比如Docker Hub)中或者被导出成一个tar文件。


Dockerfile

  Dockerfile是对Docker容器创建过程进行脚本化的系统。每个Dockerfile详细说明了开始的基础镜像,以及随后一系列在容器中运行的命令和添加到容器中的文件。Dockerfile也可以说明容器对外的端口,启动时的工作目录和缺省执行的命令。用Dockerfile构建的容器可以象手动构建那样被推送到注册库中或者导出成tar文件。Dockerfile也可以应用到Docker Hub的自动构建系统中,即在Docker公司的控制下,在系统中根据Dockerfile从头构建镜像,并且这个镜像的源对于使用它的任何人都是可见的。


一个进程?

  手动构建还是使用Dockerfile来构建镜像,考虑的关键在于容器刚启动时只能执行一个单进程。如果容器的服务目的比较单一,比如只运行一个应用服务器,那么运行单个进程就没什么问题(一些争论说容器本应该只包括一个进程)。对于那些希望在容器中运行多个进程的情况,管理进程(supervisor process)需要先启动,这样它可以接着孵化出其他期望的进程。此时容器中没有初始的系统,所以任何事都要依赖systemd,不修改新兴系统或类似系统都无法工作。


容器和微服务

  全面描述使用微服务架构的哲理和益处已经超出了本文的范围(InfoQ eMag: Microservices中有全面的阐述)。容器仍然是一种方便的方法来绑定和部署微服务的实例。

  虽然目前微服务大规模的部署实例还是在(大量)虚拟机上,但容器提供了一种小规模部署的机会。容器具有共享的内存和针对操作系统的磁盘占用、通用代码库,这也意味着可以非常有效地一起部署多个版本的服务。


连接的容器

  一些小的应用适合放在单个容器中,但许多情况下应用需要扩展到多个容器。Docker成功催生了一系列新的应用合成工具、编制工具以及平台即服务实现。绝大多数努力的后面,是希望能简化从一组相互连接的容器来创建应用的过程。很多工具在扩展、容错、性能管理和部署资产的版本控制方面也提供了帮助。



酷毙

雷人

鲜花

鸡蛋

漂亮
  • 快毕业了,没工作经验,
    找份工作好难啊?
    赶紧去人才芯片公司磨练吧!!

最新评论

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部