在镜像,但独立的生产环境中发生故障
我在“开发环境应尽可能接近生产环境”方面遇到一些问题。
(生产机器的操作系统是Linux。)
我对开发步骤的理解(粗略):
- 代码,编译,testing/运行,重复
“通常情况下,”我会在自己的机器上浏览这些代码,然后将代码推送到CI进行testing,并可能进行部署。 CI将负责在与生产相匹配的环境中运行testing,这样,如果testing通过,则认为代码在生产中也可以正常工作。
环境较大的问题
☑某种数据库。
☑作业处理池 – 用于一些长时间运行的后台任务。
☑用户帐户pipe理 – 也被其他系统使用。
☑集中logging – 理智。
☑转发代理 – 在同一url但不同path下绑定各个http可访问的服务。
☐可能的其他服务或服务集合。
解决scheme?
- 所有在我自己的机器上? 在地狱里没有办法。
- 所有在虚拟机上? 也许,但是安全方面,如果这个设置应该反映prod.env。和prod.env。 就是这样,好吧..如果违反,这可能不是一个好主意。
- 除以责任,并在多个虚拟机上设置它们? 谁来pipe理所有这些机器? 我认为可以做得比这更好。
- 使用像Docker这样的容器,或者自己一起打巴掌? 听起来不错:(可能:)非常快的迭代周期,关注点分离,一些分离的安全性,以及容易的重现性。
为了简单起见,假设我们select的集装箱化工具是Docker,而且我们不打算使用libvirt / lxc工具/直接内核调用来构build自己的工具。
所以Docker可能是CoreOS或者Project Atomic。 所以现在有一个应用程序(或多个应用程序)的容器已经与系统的其他部分分离,并且可以在任何地方几乎相同。
- 解决scheme1:生产环境漂亮,优雅。
- 问题1:这不是开发环境。
开发环境
不pipe怎样select不把生产环境洒到我自己的机器上,问题依旧:
即使生产环境设置正确,我也必须在某处进行编译和testing,然后才能部署(通过CI或其他方式进行另一轮testing)。
我如何解决这个问题?
实际上,解决这个问题的正确方法是通过在自己的机器上编写代码,使其在虚拟镜像生产环境中同步/直接可见,从而自动运行testing?
当我不想运行所有的testing时,会发生什么情况,但是现在只有我正在编写的部分呢? 每次都要编辑自动编译过程吗? 怎么样远程debugging,因为多个系统必须编排以正确的方式运行,debugging必须附加到其中一个程序之间。 更不要说“ 代码,testing ”周期的速度,这将是非常缓慢的。
这听起来像CI这样的helluvalot,但是多个开发人员不能全部使用相同的CI并修改它,所以他们可能必须在自己的机器上进行此设置。
我也在想,开发者可以使用一个完全虚拟化的操作系统,它包含了所有的开发工具,并且在生产环境中是镜像的,但是这会迫使老用户采用虚拟开发环境的工具,听起来这个好主意。