八种Docker开发模式

Docker已经成为当今炙手可热的容器技术,网上也有很多相关的文档可供我们学习,但是到底应该如何使用Docker,它到底有哪些开发模式呢?Vidar Hokstad最近在自己的博客上分享了自己使用Docker的一些经验,他概括了八种Docker开发模式,本文以Vidar Hokstad的这篇文章为主线,结合HackerNews上对该文的评论以及InfoQ等网站上的Docker使用范例翻译整理而成,希望对你有所帮助,如果想查看Vidar Hokstad的英文原文,请点击这里。

Vidar Hokstad认为他所有Docker经验的基础是将状态信息保存到独立的位置,这样就能够在不丢失数据的情况下重新创建Docker容器。他在自己文章中分享的示例都有一个共同的关注点,那就是可以在任意时间随意地替换容器而不用考虑任何事情。Vidar Hokstad认为越有规律地重新创建容器,这些要点越会成为习惯,我们就越不会将状态保存到明确定义的位置之外。

Vidar Hokstad一共分享了8种不同类型的Docker开发模式,分别是:共享基础容器、共享卷(Volume)开发容器、开发工具容器、不同环境下的测试容器、构建容器、安装容器、整合默认服务(Default-Service-In-A-Box)的容器和基础设施/粘合(Glue)容器。

共享基础容器类似于“继承”,Vidar Hokstad认为这是有效使用Docker的基础,因为这样做让我们不再需要重新执行与往常一样的步骤从而减少了构建新容器所花费的时间。针对自己所拥有的大量容器,Vidar Hokstad将自己的基础设置提取到了针对各种目的的基础容器中,从而实现了基础环境的完全可支配。

对于开发容器,Vidar Hokstad让它们共享至少一个使用host:/home的卷。这样仅重启(而不是重新构建)容器就能够获得代码更改。因为是从一个共享仓库获取代码,同时基于一个共享的基础容器,所以在添加、修改、移除依赖的时候这些容器通常都能够非常快速地重新构建,不必纠缠于非法的依赖关系。

而对于那些喜欢使用SSH会话操作代码不太使用IDE的人而言,Vidar Hokstad认为他们可以构建自己的开发工具容器,避免混淆开发和产品依赖以及开发工具依赖。而为了在不同的环境中测试自己的代码,我们可以针对不同的环境构建各自的测试容器。

还有其他几种使用模式,在此我们就不一一列举了,感兴趣的读者可以点击这里,总之,Vidar Hokstad的观点就是我们在使用Docker的时候应该尽可能地通过合理的共享避免冗余设置,同时针对不同的使用目的构建有针对性的Docker容器,达到随时随地随意使用的效果。

当然,针对Vidar Hokstad分享的内容也有人提出了不同的观点。HackerNews上的用户cpuguy83就认为项目的开发、测试以及产品等阶段应该采用同一个Dockerfile。他认为虽然确实可能需要对环境做一些改变,但是这些都应该是运行时配置,可以通过环境变量或者改变容器中运行的命令来实现。msane则评论说开发、产品等Docker环境的唯一不同是服务器的拓扑结构,对于本地开发环境而言,拓扑结构是一个盒(box),一个“包罗万象(all-in-one)”的系统。这种情况下你不需要为每一个环境准备不同的Dockerfile,它仅意味着你必须创建不关心拓扑结构的Dockerfile。如果你想了解HackerNews上与此话题相关的讨论,可以点击这里。

在国内的社区上也有一些人分享了自己使用Docker的一些经验,其中makewonder在博客上发表了题为《利用Docker构建开发环境》的文章,他提到:想要搭建一个节省磁盘空间和扩展性良好的开发环境,最重要的第一步就是构建一个基础性的Docker镜像,例如,如果你的主开发语言是Ruby,那么你首先需要一个已经安装好ruby、bundler和gem等必须工具的基础镜像,然后你需要在此基础上扩展这个基础的镜像从而生成针对不同目的的开发环境,例如rails、或者是nats。Docker提供了一种标准化的DSL,你只需要编写一个Dockerfile,运行docker build指令,就可以构建自己的Image。

对于Vidar Hokstad提到的这些模式你是否有自己的看法呢?或者你是否有一些自己的使用模式要和大家分享呢?如果有那么请联系我们:[email protected]

感谢郭蕾对本文的审校。

给InfoQ中文站投稿或者参与内容翻译工作,请邮件至[email protected]。也欢迎大家通过新浪微博(@InfoQ)或者腾讯微博(@InfoQ)关注我们,并与我们的编辑和其他读者朋友交流。

你可能感兴趣的:(八种Docker开发模式)