大数据用 Docker 和火星上种土豆一样靠谱!
三十年后,当马特·达蒙回忆起自己波澜壮阔的一生,最令他回味的,也许不是参加了诺曼底滩头的迷茫战斗《拯救大兵瑞恩》,不是在失忆的惊惶中流亡天涯《谍影重重》,也不是冰天雪地里 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 ,存储容器过程中产生的数据。比如,你有一个数据库容器,你希望这个容器停止或被删除后,其中的数据能够保存下来。
灵雀云也提供了持久化存储服务,将云存储抽象成最直观的存储卷,可以直接挂在容器上,就像本地操作 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 ,生产环境对本地环境的依赖变得很小。随着我们的发展,这种效率的提升变得越来越明显。