三十年后,当马特·达蒙回忆起自己波澜壮阔的一生,最令他回味的,也许不是参加了诺曼底滩头的迷茫战斗《拯救大兵瑞恩》,不是在失忆的惊惶中流亡天涯《谍影重重》,也不是冰天雪地里30多年的春秋大梦《星际穿越》,而是红色星球上种土豆的日子《火星救援》。
据说,空间站宇航员已经食用过了太空生长的莴苣。NASA一位植物学家也称,人类可以在火星上栽种土豆,而且可种植的不止土豆一种。2014年,荷兰就有一群好奇的科学家,已经在模拟月球土和模拟火星土上,种植了西红柿、胡萝卜、小麦等14种农作物。
所以,那个15岁起就被美国国家实验室聘为软件工程师的『太空宅男』安迪·威尔,即使写小说,也是很靠谱的!
看完『火星救援』,今年值得期待的科幻大片就剩『星战7』了。
据说『星战7』在北美的预售票房就超过了5000万美元,70%都是18-49岁的男粉丝,平均年龄在34岁,67%的人都会在上映一周之内就去一睹为快……
以上这些数据都是由一家叫Movio的公司发布的,Movio是干嘛的呢?
Movio主要有两个产品,Movio Cinema和Movio Media,Movio Cinema主要和各大影院合作(已经覆盖了北美52%的荧幕,全球24.5%),通过大数据分析为影院的顾客提供个性化的服务;Movio Media则主要服务于电影的制造商和发行商,利用Movio Cinema上收集到的数据,为制片商和发行商提供有效建议。总之就是一家立志用大数据分析和互联网改变电影产业的公司。
而Movio正是Docker的重度用户。Movio为了使其代码能在日益复杂的同时,保持弹性扩展,开始采用微服务架构和Docker。以下内容来自Movio的技术博客,主要讲述了其如何在开发环境中使用Docker。
Docker将应用封装在一个『完全的』OS环境中,并运行在一个容器里。容器和虚拟机很类似,但是更像物理机:比如,内存并不是提前分配给容器的,需要容器向主机动态申请。
使用容器意味着库依赖(Library dependencies)可以独立于主机系统,被提前安装好。其它的依赖,比如配置文件也可以被提前配置好默认值,并放在合适的位置。有了Docker就相当于每个应用,不管在任何操作系统中,都能有一套标准的环境以相同的方式运行起来。主机操作系统中安装的库(Library)和软件包(package)不会影响到应用,因为这些应用是相互独立的。
Docker在Movio的开发过程中主要是这么用的:
Run anywhere
程序猿们对OS X和Linux多个发行版可谓各有所爱,由此造成的开发环境不统一问题,是非常痛苦的。而应用运行在容器中,意味着每个人都能依赖于相同的配置。而当你需要一些个性化配置时,也可以在启动容器时设置参数。
比如,你可以在容器外挂载一个volume,存储容器过程中产生的数据。比如,你有一个数据库容器,你希望这个容器停止或被删除后,其中的数据能够保存下来。
为方便进行相关实践,可在一些容器平台上进行测试。比如灵雀云(www.alauda.cn)也提供了持久化存储服务,将云存储抽象成最直观的存储卷,可以直接挂在容器上,就像本地操作Docker的存储卷一样方便。在存储卷基础上,为了进一步提升数据的持久性,灵雀云还提供“存储卷备份”,可用于抓取存储卷闪照并进行保存。
方便各个组件间的集成
如果你有一个微服务,需要和另外一个小组维护的微服务做集成,运行docker pull就可以将那个微服务下载到在你的环境上,都不用担心环境依赖的问题。
这个过程完全复制了各个服务在生产环境中的交互,这也使得我们相信在测试环境中看到的结果,会被完全地反映到生产环境中。
灵雀云支持多容器发布管理,与docker-compose兼容,可通过YAML文件描述应用的容器组件,以及容器间的依赖,并一键部署完整的多容器应用。
可组合的Docker镜像
基于此,可以简单地复用之前做过的工作,我们有一系列的核心的基础镜像,同时也意味着我们的镜像都基于相同的基础。同时,各个组之间也可以复用镜像。
Docker镜像是分层管理的,每个部分都被实现为其中一层,并且可以共享base层,带来的好处有2个:减小了Docker库的,缩短了下载新镜像所用的时间。
灵雀云提供高性能本地Registry服务用于创建私有、公有镜像仓库,并提供上传、下载、构建及托管的全方位镜像服务
加强开发、测试和运维的协作
用了Docker后,开发人员会更具有全局思维,他们会有意识地去思考在开发环境之外,运行这个应用还有哪些需要。
而测试环境将是生产环境的复制,并且是标准化的,因为Docker镜像都是标准化的,pull下来就能马上运行起来,不需要再根据文档一步步地配置。
Docker带来的挑战
Docker的实现机制也意味着会有很多的基础镜像依赖。例如,我们有一个Clojure写的微服务,它是基于Clojure镜像构建的,但Clojure镜像又是基于Java镜像构建的,Java镜像又要基于一个通用的基础镜像。一旦这个基础镜像发生了改变,所有的中间镜像都要重新build,这无疑增加了额外的开销。
由于Docker是基于Linux内核的,在OS X系统上就需要在虚拟机中运行一个Linux的操作系统。官方的工具是基于VisualBox的,文件和文件夹要先mount到VM上,再mount到Docker容器,尽管这个工具可以自动做到这些,但是chown和chmod的操作无法工作。
OS X中文件名是不区分大小写的,但是大部分Linux系统都是区分的。如果不正确的命名恰好在挂载路径中出现,就会找不到这个路径。
以上这些挑战是在本地主机环境中使用Docker会遇到的问题,如果使用CaaS服务,比如灵雀云都可以避免以上的问题,将您的精力放到核心业务上,同时享受Docker带来的诸多好处!
总结
在使用Docker的初期,肯定会有一个学习曲线,但是总体来说,Docker确实提高了我们的生产效率。在以往,新员工入职需要数天才能配置好本地环境,并且一直会被环境问题所困扰。有了Docker,生产环境对本地环境的依赖变得很小。随着我们的发展,这种效率的提升变得越来越明显。