Docker部署Java项目持续集成?


刚接触Docker,有一个疑问。我用Docker部署Java Web项目,其中的Java容器是Tomcat。写好了一个Dockerfile,根据Dockerfile来生成镜像。我的问题是项目有新版本发布,或者BUG修复,意味着我又需要重新build镜像创建容器运行。是否有方法可以在已有的Docker容器种来发布这个新版本?
已邀请:

tifayuki - Tutum 工程师

赞同来自: DockOne ahjdzx1990 向太陽奔跑Alan VectorHo


我来说一下docker style吧: immutable infrastructure(不可变的架构?)

是Jérôme Petazzoni@Docker 大神在2015 Gluecon(就是三天前)做的演讲(http://www.slideshare.net/jpet ... -2015

简单的说就是不要去容器里改变任何东西,哪怕只有修改CSS这种情况,你都应该重新构建一个镜像,然后去部署。

比较好的做法是:
1. 你的dockerfile和java的代码都保存在github(也可以是其他的地方),然后本地修改代码,修改好了,commit到github的staging分支上去。
2. 这时候CI会自动为你在staging上跑测试。
3. 当测试通过后,你去把代码merge到master,然后master会再次运行CI,并自动根据你的代码构建镜像。
4. 镜像构建好之后,会推送到你相应的私有repository去。
5. 当有新版本的镜像被推送后,会自动部署到production

这样就完成了一个开发部署的闭环,也是tutum所宣传的container platform
开发者只需要专注于开放,当代码提交后,平台会自动部署代码到生产环境,这就是最大的优点。

wendell_cy

赞同来自:


提交一个新版本应该就可以了吧。

9lives - 爱生活,爱云计算。

赞同来自:


个人的经验是,将你的源代码以卷的方式映射到容器中,容器只保留tomcat等固定设置,每次build直接attach卷到已有容器中就可以了。或者将tomcat+ java等做成base image,每次build其实很快的。

刚接触docker不足一个月,如有不正确之处,欢迎讨论。:)

xiaolunsanguo - 京东商城-TIG-JDOS团队

赞同来自:


这种版本迭代的情形应该具有普遍性。
我的做法是做两个Dockerfile。
一个Dockerfile用以描述你的运行环境,这个run一次就可以了,生成base镜像。
然后另外一个Dockerfile从base镜像基础上(FROM base),然后ADD你的代码到指定目录并有相关配置。每次只要build这个Dockerfile就可以了。

huangqg - TenxCloud时速云创始人

赞同来自:


你好,你可以用tomcat镜像创建一个容器,然后将war部署在tomcat里,当然这个war包可以通过持续集成来构建,tomcat容器可以保证只有一个。你可以用时速云做到这一点 https://www.tenxcloud.com/

捏星星

赞同来自:


建议JAVA的运行环境加tomcat这些做成base image。tomcat的root目录固定。
然后在宿主机上部署JAVA的目标文件,可以以版本号做路径。
然后每次docker run base image的时候把tomcat的root mount到宿主机的相应版本下。
这样做的好处就是不用build多个image,版本控制可以在docker run的时候控制。image仅仅是tomcat的运行环境 跟业务无关。

要回复问题请先登录注册