使用docker,木偶和jenkins进行连续交付和PROD部署
需要为新项目设置基础结构。 以前我曾经和jenkins一起使用puppet standalone,但是现在我正在考虑使用docker构build,这样我就可以从开发中推动stage'ing到production而不会触发构build,但是通过简单地获取docker现有的docker图像build成。
该应用程序:
- Java Web应用程序与restAPI支持postgresql,neo4j,elasticsearch
- 客户端应用程序编写的angular度,通过restAPI与Java谈判
- 存储在git仓库中的代码
ENVS:
- 开发服务器(build设,开发+testing环境) – 32GB的Linux机器
- testing服务器(AWS)
- 生产(AWS)
build立:
所以基本上我在想这样的事情:
- 为java + cient应用程序,postgresql,elasticsearch,neo4j提供独立的Docker镜像,通过Docker卷或者使用Docker数据容器将数据存储在主机上(尚未确定方法)
- Jenkins构build了所有代码并创build了Docker镜像,这些镜像将被推送到私有的内部存储库
- 集成testing使用DEV服务器上的Puppet docker模块运行
- 通过使用Docker,通过木偶推送到jenkins的生产
为什么我应该使用docker?
- 大开发机器 – 可以轻松地运行我的应用程序的多个instaces,而不需要虚拟化(可能有一个不稳定的开发,稳定的开发,坐等)
- 易于部署(使用docker和puppet docker模块)和回滚(只需从Docker存储库中检索以前的版本)
- 快速迁移和产生新实例的能力
- 准备系统不同部分的简单缩放(例如,聚类elasticsearch)
问题
- 这看起来合理吗?
- 我正在考虑使用这个傀儡模块https://github.com/garethr/garethr-docker 。 如何通过它更新我的环境? 我必须以某种方式停止docker集装箱,做一个docker工人,然后docker运行?
- 我们使用liquibase进行数据库更新pipe理。 猜猜这应该离开docker更新/回滚separetly?
欢迎任何build议,谢谢。
您正在构build一个容器协调的PAAS 。 我的build议是看看类似的系统可能值得仿效的最佳实践。
首先要开始的是由Heroku的共同创始人之一编写的12因子应用程序网站。 该网站是令人难以置信的有用的,描述了现代云计算应用程序的一些理想的操作function。 下一站将是Heroku本身,以获得“现代”开发和部署环境可能/可能的样子。
我也build议看看一些新兴的开源的PAAS平台。 像Cloud Foundry和Openshift这样的大型供应商支持的系统现在都是风靡一时,但更简单的解决scheme(build立在docker上)也正在兴起。 其中一个, Deis使用了一个相关的技术厨师 ,所以可能会提供一些关于puppet如何用来pipe理你的docker容器的信息。 (现代Deis不再使用厨师)
回答:
- 是的,这是相当合理的。
- 像Heroku一样pipe理“环境”,只是为每个应用程序版本创build一个新的应用程序。 这是“ 构build,发布,运行 ”模式。 在你的情况下,Jenkins由新代码触发,创buildDocker镜像,可以将其保存到存储库中,并用于部署应用程序版本的实例。
- 数据库将是一个“ 支持服务 ”的例子,您可以在应用程序创build时连接到您的应用程序。 升级将相当于停止一个应用程序版本,并启动另一个都连接到相同的数据库。