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 提到的这些模式你是否有自己的看法呢?或者你是否有一些自己的使用模式要和大家分享呢?如果有那么请联系我们: editors@cn.infoq.com 。
感谢郭蕾对本文的审校。
给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。
评论