JAVA项目如何经过Docker实现持续部署

本篇实操性的案例讲解——JAVA项目如何经过Docker实现持续部署(只需简单四步),java

即:开发经过git push上传代码,经Git和Jenkins配合,自动完成程序部署、发布,全程无需运维人员参与。git

这是一种真正的容器级的实现,这个带来的好处,不单单是效率的提高,更是一种变革:服务器

开发人员第一次真正为本身的代码负责——终于能够跳过运维和测试部门,自主维护运行环境(首先是测试/开发环境)。app

难者不会,会者不难。经过简单的4个配置,便可优雅地实现持续部署。本文依惯例放上目录,请享用。运维

  1. 持续部署的技术思路maven

  2. 效果展现ide

  3. 配置Git和Jenkins联动测试

  4. 配置Jenkins自动更新代码spa

  5. 效果图文详解3d

  6. FAQ

好吧,咱们正式开始。

1. 持续部署的技术思路

在本例中,假设咱们JAVA项目的名称为hello。简要的技术思路以下。

本案例中假设代码托管在git.oschina.com上,Jenkins和Docker Registry(相似于yum源)各运行在一个Docker容器中。JAVA项目本身也单独运行在一个叫hello的容器中。

本文采起的持续部署方案,是从私有的Docker Reistry拉取代码。有些变通的方案,把代码放在宿主机上,让容器经过卷组映射来读取。这种方法不建议的缘由是,将代码拆分出容器,这违背了Docker的集装箱原则:

这也致使装卸复杂度增长。从货运工人角度考虑,总体才是最经济的。这样,也才能实现真正意义的容器级迁移。

或者说,容器时代,抛弃过去文件分发的思想,才是正途。本文最后的问答环节对此有更多阐述。

容器即进程。咱们采用上述方案作Docker持续部署的缘由和意义,也在于此。容器的生命周期,应该远远短于虚拟机,容器出现问题,应该是当即杀掉,而不是试图恢复。

2. 效果展现

本文最后实现的效果,究竟有多惊艳呢?且看以下的演示。

2.1 程序代码更新前的效果

咱们以时间戳来简洁、显式的表述程序更新状况。

2.2 提交程序代码更新

本例中,咱们把首页的时间戳从201506181750,修改成201506191410(见以下)。

2.3 上传新代码到Git

顺序执行以下操做,输入正确的git帐号密码。

而后呢?

而后什么都不用作了。端杯茶(若是不喜欢咖啡的话),静静地等待自动部署的发生, 旁观一系列被自动触发的过程,机器人似的运转起来(请容稍候再加以描述)。

为何须要3~5分钟?只是由于本案例中的JAVA项目,须要从国外download Maven程序包,以供Jenkins调用和编译JAVA。正式应用环境中,能够把Maven源放在国内或机房。若是仅仅须要对PHP项目作持续部署,那就更快捷了。

2.4 查看代码更新后的效果

在静静地等待几分钟后,新的代码确实已经自动部署完毕。

那么,这一切怎么实现的呢?很复杂么?否则。只要按照以下几步,即可快速实现哦。

3. 配置Git和Jenkins联动

这个过程也是难者不会,会者不难。主要分为以下三步。

3.1 Jenkins配置Git源

Jenkins中新建项目java-app,并配置从Git拉取程序代码。具体以下:

3.2 Jenkins配置远程构建

Jenkins中配置token,以供git远程调用时使用。

3.3 Git开启钩子

怎么让Git在接收到用户更新的代码后,把消息和任务传递给Jenkins呢?这借助于Git的hook功能,配置起来也很是简单,以下。

4. 配置Jenkins自动更新代码

Jekins在接收到Git传递过来的消息后,再触发一个远程构建(到目标服务器),按照预约义的任务列表,执行一系列的工做,重建容器等。详见以下:

咱们把其中最关键的Shell脚本内容摘抄出来。

5. 效果图文详解

在2.3这个章节中,咱们当时的操做以下,这个目的是向Git提交更新代码。

当时并无细说后续发生的事情,既然上面已经说清楚了原理,那咱们就能够接下来讲说实际发生的事情啦。

5.1 上传代码到Git

这里貌似整个过程已经完成并顺利退出。其实,后台的工做才刚刚开始哦。

这时会触发Git服务器向相应的Jenkins服务器发出一个操做请求,此工做太过迅速,也没啥好说的,咱们接下来看Jenkins都干啥子了。

5.2 Jenkins进行的精彩互动

1)Jenkins会自动冒出来一个构建任务。

2)咱们点进来,看看具体操做日志。是的,正在接受来自Git的任务。

3)下载Maven相关的软件包(就是这个过程慢)。

4)下载完成后,就开始利用maven BUILD 新的hello项目包。

5)而后重建Maven容器,构建新的Image并Push到Docker私有库中。

6)最后,从新把Docker容器拉起来。这样,又新生了。呵呵

相关文章
相关标签/搜索