基于Dokcer技术 对Web应用的持续集成探究

简介: 摘要传统的虚拟化技术仅提供了从物理机到操作系统级的虚拟化服务,而正在如火如荼发展的Docker容器技术做到了在系统级虚拟化之上,对应用服务进行方便的管理。

摘要

传统的虚拟化技术仅提供了从物理机到操作系统级的虚拟化服务,而正在如火如荼发展的Docker容器技术做到了在系统级虚拟化之上,对应用服务进行方便的管理。但是当开发者需要测试和上线Web应用时,由于版本迭代问题,常需要手动进行重新部署。本文基于Docker对于应用服务的快速发布和部署能力,结合已有的jenkins持续集成服务,尝试对Web应用的持续集成进行探究。

正文

持续集成既能够实现代码频繁集成,进行频繁迭代测试,通过频繁构建尽发现问题,从而在保证软件质量的同时加速软件开发的过程。

持续集成不是用来防止代码缺陷的出现,但是它能够在软件开发前期尽早发现代码缺陷,使修复缺陷变得相对轻松简单。

Jenkins就是一个持续集成的开源软件项目,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。其基本工作流程如图1所示,开发者提交代码更新,Jenkins通过钩子监听源码管理工具获取最新代码。根据创建好的Jenkins任务及编写好的执行脚本依次完成代码构建、打包、部署、集成测试过程,最后把构建后的结果包括自动化测试的结果通过邮件发送给相关负责人。

图1.png

而Docker 是一个基于LXC(Linux Containers)虚拟化技术的高级容器引擎,使用Go语言实现的一种面向云平台的虚拟化技术。它是一款开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。因此它具有启动时间短,空间占用少、分发和复制方便、资源开销少等特点,却具备和传统虚拟机一样的隔离性和安全性。

在这里的代码更新和版本控制过程中,使用Git工具来作为代码同步更新工具。开发人员完成本地代码开发后,先通过命令或Git工具把代码提交到分支上,再将分支代码推送到项目经理处进行代码审核,审核成功后再把代码推送到主干。一旦Git仓库有更新后,Jenkins服务器会拉取新代码进行集成构建。Github的主要工作模式如图2所示。

图2.png

这里有一个需要注意的是,Docker 跟Jenkins并没有直接的联系,Jenkins是实现自动打包的,打包完也是可以实现自动部署的,并不是没有Docker 就不可以实现自动部署了,这里需要强调一点。之所以用Docker,是因为Docker 是一个相比较而言比较成熟的一种技术,而且它的优势在于,可以实现隔离,可以在不同的操作系统跑应用(Windows,Linux)并且还可以做到日志分离。

传统的Web应用从开发到上线的过程,需要开发者手动将开发好的工程部署到服务器上。在服务器上的相关环境和配置都需要开发者自己动手进行解决,同时需要解决很多形形色色与Web服务本身可能没有太大关系的问题。另外,如果开发者对于开发版本有修改和迭代更新,每次需要手动去在服务器上更新代码,并且如果是一个负载均衡集群的场景下,需要一台一台服务器进行更新代码,这样的工作量是很大的,并且都是重复性的劳动。

在这里,通过已有资料和文献,结合Jenkins和Docker各自的优点,探究两者集成后对Web自动部署快捷性方面的作用,简化Web部署为以下流程:

  1. 提交代码

  2. 获取代码

  3. 构建环境

  4. 自动部署

Jenkins是基于Java环境的,因此在宿主机中需要安装Java环境支持,另外,宿主机中还需要安装Git工具和Docker。此处的系统实验环境为Centos7.4。

图3.png

首先安装Java环境,这里使用Java1.8的版本,查看版本可以看到,具体的安装版本是

图4.png

并且由于Jenkins需要Tomcat的支持,同时下载Tomcat9的版本进行安装。

图5.png
图6.png

接下来下载Jenkins的war包,war包内是Jenkins的所有内容。可以通过直接部署在安装好的Tomcat9中来通过Web形式访问。Jenkins第一次启动需要进行安装,包括其中的Folders Plugin、Script Security Plugin等插件,安装完成后需要进行用户配置,用户名和密码是自定义的。

图7.png
图8.png
图9.png

Git工具是必不可少的,由于对于版本没有太大的要求,可以直接通过自带的yum包管理进行下载,安装git。通过在Github上建立一个测试工程,向此测试工程中更新推送Web服务的代码,Jenkins通过监听指定的Github地址,来自动获取Github上的最新代码,自动执行Shell来调用Docker进行代码到镜像的部署和启动工作。

图10.png

最重要的是Docker的安装和基础镜像的搭建。由于Centos7中带的yum源中,docker版本已经是比较新的1.12,可以直接通过yum install docker.io来安装。安装完成之后,需要为持续集成部署的Web服务提供一个基础的网站服务器环境镜像,之后的Jenkins工作可以直接基于此已有的基础镜像来进行。

由于仅仅是探究Docker和Jenkins的结合,这里仅仅使用静态页面的更新来进行测试,因此基础环境不使用Tomcat和Java的JDK,而是选择一个nginx的环境。


图11.png

通过docker search nginx命令来查找hub上已经存在的nginx环境镜像,选定一个nginx环境镜像,下载此已有的nginx环境镜像,在此基础上进行修改,可以较快速地得到可以用于部署Web的环境。

图12.png

在Git工具、Docker以及Jenkins都已经安装完成并且准备就绪后,可以开始集成和整合。首先需要在Jenkins中创建一个工程,并且将其命名为test。在这里,接下里的配置文件中可以通过设置hook以及定时器来定时检测指定的Github项目的更新变化,进行触发拉取动作,如图14中的第一个和最后一个选项。在这里,因为仅仅是测试,不开启自动拉取,使用执行构建。

图13.png

配置的最后,是可以在项目拉取完成和构建后,执行的shell命令配置。而这段shell的配置,是在这里探究Jenkins和Docker集成进行Web自动部署的关键之处。

在nginx镜像中,使用的nginx的html默认目录在/usr/share/nginx/html下。Jenkins的默认代码下载在/root/.jenkins/workspace/下,因此在每次Jenkins从Github上获得更新代码后,直接执行shell脚本,将下载的Web的代码的路径映射到nginx镜像中的html默认目录中即可。并且在每次执行shell时,都先删除docker中上一次已经运行的实例容器,进行新的目录内容映射后,再次创建新的容器。

图片.png

因此最后形成的完整shell代码如图14,保存后配置生效。

图14.png

最后进行Web应用的自动部署测试。在Github新建一个项目,内容只有一个test.html,内容是“jenkins测试”。在Jenkins的test工程配置中添加此git地址,并且保存配置。


图15.png
图16.png

配置保存后执行构建,构建完成后访问页面,得到内容为“jenkins测试”,如图17。

图17.png

开发本地修改test.html的内容为“测试持续集成”后,使用git push向github更新代码,并且再次在Jenkins上构建,再次访问服务器后,网页内容已经更换。查看Jenkins输出日志和页面结果如图21、图22。

图18.png
图19.png
图20.png
图21.png

通过上述Jenkins和Docker配合Git实现Web应用的快速部署更新,可以看到其效率可以大幅提高。开发者只需要向Git项目地址提交代码,Jenkins执行构建即可自动完成部署等操作,并且如果在Jenkins中配置了Hook钩子和定时器抓取的设置,身子可以节省手动Jenkins的构建过程,给开发者的开发和Web应用服务的部署带来了极大的便利。

参考文献:

尹高. 基于Docker的服务器运维平台的设计与实现[D]. 华中科技大学, 2016.

边俊峰. 基于Docker的资源调度及应用容器集群管理系统设计与实现[D]. 山东大学, 2017.

钟良侃. Docker技术在Web服务系统中的应用研究[J]. 电脑知识与技术, 2016, 12(26):123-126.

张力文. 基于Jenkins的项目持续集成方案研究与实现[D]. 西南交通大学, 2017.

目录
相关文章
|
14天前
|
前端开发 JavaScript 关系型数据库
从前端到后端:构建现代化Web应用的技术探索
在当今互联网时代,Web应用的开发已成为了各行各业不可或缺的一部分。从前端到后端,这篇文章将带你深入探索如何构建现代化的Web应用。我们将介绍多种技术,包括前端开发、后端开发以及各种编程语言(如Java、Python、C、PHP、Go)和数据库,帮助你了解如何利用这些技术构建出高效、安全和可扩展的Web应用。
|
29天前
|
监控 Serverless 测试技术
Serverless 应用引擎常见问题之做的web服务计费如何解决
Serverless 应用引擎(Serverless Application Engine, SAE)是一种完全托管的应用平台,它允许开发者无需管理服务器即可构建和部署应用。以下是Serverless 应用引擎使用过程中的一些常见问题及其答案的汇总:
399 3
|
6天前
|
缓存 负载均衡 数据库
优化后端性能:提升Web应用响应速度的关键策略
在当今数字化时代,Web应用的性能对于用户体验至关重要。本文探讨了如何通过优化后端架构和技术手段,提升Web应用的响应速度。从数据库优化、缓存机制到异步处理等多个方面进行了深入分析,并提出了一系列实用的优化策略,以帮助开发者更好地应对日益增长的用户访问量和复杂的业务需求。
9 1
|
6天前
|
缓存 监控 数据库
Flask性能优化:打造高性能Web应用
【4月更文挑战第16天】本文介绍了提升Flask应用性能的七大策略:优化代码逻辑,减少数据库查询,使用WSGI服务器(如Gunicorn、uWSGI),启用缓存(如Flask-Caching),优化数据库操作,采用异步处理与并发(如Celery、Sanic),以及持续监控与调优。通过这些手段,开发者能有效优化Flask应用,适应大型或高并发场景,打造高性能的Web服务。
|
8天前
|
数据库 开发者 Python
Python中使用Flask构建简单Web应用的例子
【4月更文挑战第15天】Flask是一个轻量级的Python Web框架,它允许开发者快速搭建Web应用,同时保持代码的简洁和清晰。下面,我们将通过一个简单的例子来展示如何在Python中使用Flask创建一个基本的Web应用。
|
11天前
|
JavaScript 前端开发 API
Vue.js:构建高效且灵活的Web应用的利器
Vue.js:构建高效且灵活的Web应用的利器
|
20天前
|
XML JSON JavaScript
使用JSON和XML:数据交换格式在Java Web开发中的应用
【4月更文挑战第3天】本文比较了JSON和XML在Java Web开发中的应用。JSON是一种轻量级、易读的数据交换格式,适合快速解析和节省空间,常用于API和Web服务。XML则提供更强的灵活性和数据描述能力,适合复杂数据结构。Java有Jackson和Gson等库处理JSON,JAXB和DOM/SAX处理XML。选择格式需根据应用场景和需求。
|
1月前
|
前端开发 JavaScript 安全
深入探索 Qt6 web模块 WebEngineCore:从基础原理到高级应用与技巧
深入探索 Qt6 web模块 WebEngineCore:从基础原理到高级应用与技巧
71 0
|
1月前
|
缓存 监控 应用服务中间件
如何使用负载均衡器提升Python Web应用的性能?
【2月更文挑战第27天】【2月更文挑战第94篇】如何使用负载均衡器提升Python Web应用的性能?
|
19天前
|
监控 JavaScript 前端开发
《理解 WebSocket:Java Web 开发的实时通信技术》
【4月更文挑战第4天】WebSocket是Java Web实时通信的关键技术,提供双向持久连接,实现低延迟、高效率的实时交互。适用于聊天应用、在线游戏、数据监控和即时通知。开发涉及服务器端实现、客户端连接及数据协议定义,注意安全、错误处理、性能和兼容性。随着实时应用需求增加,WebSocket在Java Web开发中的地位将更加重要。

热门文章

最新文章