编者按:IronWorker是一个面向开发者的任务队列服务,开发人员可以在不设置和管理任何基础设施的基础上,调度执行大规模的任务。几个月前,Iron开始试用Docker,如今其内部已经部署了3亿多个Docker容器,本文中分享了IronWorker在使用基于Docker的基础架构时,遇到的挑战、解决方法,以及其中的收获。以下为原文: IronWorker是一个任务队列服务,他让开发人员在不用设置和管理任何基础设施的基础上,调度执行大规模的任务。我们3年多前推出这项服务时,使用了包含所有的语言和代码包的LXC容器运行任务。Docker使我们能够轻松地升级和管理一组容器,为客户提供更多的语言环境和安装包。 我们刚开始使用的是v0.7.4版本的Dokcer,使用过程中遇到一些困难(不能正常的关闭是一个大的问题,但是后来已经被解决了),我们已经成功地克服了所有的困难,并且发现Docker不仅仅满足了我们的需求,更是超出了我们的预期。因此我们在我们的基础架构中推广使用Docker。基于我们的经验来看,这样做是有意义的。 优势下面列出几点我们意识到的Docker的优势: 更新维护镜像非常容易 Doker 使用类似git的非常强大的方法来管理Image,使得它能很方便地管理大量的、不断变化的环境,他的Image分层系统不仅节省空间而且使我们拥有更细区分度的images。 现在,我们能够跟上快速更新的语言的节奏,我们能够提供专门的例如一个新的专门为媒体处理而设计的ffmpeg stack。我们现在有多达15个不同的堆栈并且正在迅速扩大。 资源分配 基于Lxc的容器是操作系统级别的虚拟化方法,所有的容器共享系统内核,但是每个容器可以被约束使用指定的资源,比如CPU,内存和I/O.Docker提供REST API、环境版本控制、获取/提交镜像、轻松获取统计数据等功能。Docker支持使用CoW文件系统来更安全的隔离数据。这意味着,任务中对文件的所有改变都分开存储,并可以用一个命令清除。 LXC是不能跟踪这种变化。 Dockerfiles使得集成简单 我们的团队遍布世界各地。只要发布一个简单的Dockerfile就可以下班,当你休息时,可以保证其他工作的人能够生成和你的一样的镜像。克服了不同地方的人有不同的作息时间的困难。干净的镜像使得它部署和测试更快。我们的迭代周期更快,团队里每个人更加开心。 不断壮大的社区 Docker在非常快得更新,甚至比chrome更快。更重要的是,参与增加新功能和修复bug的社区数量在大量增加。 无论是为为镜像贡献还是为Docker做贡献,甚至是为Docker的周边工具做贡献,有一大批聪明的人正在为其努力,因此我们也不能置身事外。我们发现Docker的社区非常活跃有意义,我们很高兴能够成为其中一员。 Docker + CoreOS 我们也处在探索阶段,但我们发现Docker和CoreOS的结合对于我们来说似乎是更好地选择。Docker提供了稳定的镜像管理和容器。CoreOS提供了一个精简的云操作系统、机器级别分布式编排和虚拟状态管理。这个组合关注问题的不同方面,是一个更合理的基础设施栈。 挑战每一个服务器端的技术需要微调和定制,尤其是大规模运行时,,Docker也不例外。(例如,我们跑不到5000万的任务,一个月50万小时计算,并且不断更新我们的镜像)。下面是我们使用大量Docker容器数时遇到的一些挑战: 向后兼容性不够 该领域的快速创新虽然是一个优势,但是也存在缺点。其中之一是向后兼容性差。在多数情况下,我们遇到的问题主要是是命令行语法、API的改变,从产品角度来说这不是一个严重的问题。 但在某些情况下,它影响了操作性能。例如,在任何启动容器后引发的Docker错误,我们要解析STDERR并根据错误类型进行响应(例如重试)。非常不幸的是,错误的输出格式随着版本不同变化,不得不在不断变化的结果中调试,使我们非常疲惫。 Docker的错误率 这个问题相对来说还比较好解决,但是意味着每次的更新要经过多次验证,并且你需要一直开发直到这个更新的版本被发布到了系统大部分环境中。我们几个月前使用v0.7.4,现在我们的系统更新到v1.2.0.在这个领域我们已经有了一个很大的进步。 |