一种基于Docker的Web应用一键发布方法与流程

文档序号:13640921阅读:453来源:国知局

本发明涉及互联网技术领域,具体涉及一种基于docker的web应用一键发布方法。



背景技术:

docker是paas提供商dotcloud开源的一个基于lxc的高级容器引擎,源代码托管在github上,使用go作为开发语言并遵从apache2.0协议开源。docker使用客户端/服务器(c/s)架构模式,使用openapi来管理容器整个生命周期。

镜像(image)是构建容器的基础,镜像是一种分层结构的文件系统。一个只读层被称为镜像,一个镜像是永久不会变的。由于docker使用一个统一文件系统,docker进程认为整个文件系统是以读写方式挂载的。但是所有的变更都发生顶层的可写层,而下层的原始的只读镜像文件并未变化。由于镜像不可写,所以镜像是无状态的。

容器基于docker镜像创建生成。容器可以理解为镜像的一个实例。让用户可以打包应用及程序依赖包到一个可移植的容器内,然后部署到支持docker的linux机器上(常见linux发布版本基本都支持docker)。同时,实现了进程级别的虚拟化。

dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。它们简化了从头到尾的流程并极大的简化了部署工作。dockerfile从from命令开始,紧接着跟随者各种方法,命令和参数。其产出为一个新的可以用于创建容器的镜像。

镜像在保存dockerhub的仓库(repository)中的,镜像仓库类似于git中仓库的概念。一个仓库中可以保存很多镜像,或者说很多版本的镜像。也和git一样,dockerhub也通过标签(tag)来标签镜像的不同版本。

编排是一种用来运行多个docker容器的工具。可以使用编排文件定义应用。然后一条命令出发执行并创建容器运行被定义的应用。

现有非基于docker的web应用发布系统,往往实现的是在固定一台或几台主机上进行编译,然后打包并分发该打包文件至目标机,最后解压部署在该目标机上。具体分析如下:

1、在特定的一台或几台主机上编译。这类主机拥有执行编译所需依赖。如果同种编译方式,涉及使用不同版本的编译工具,如gradle3.x,gradle4.x。一般的方式是在不同的编译主机上执行编译。

2、在指定工程目录下进行打包。如xxx-serviceweb应用放置于/home/admin/xxx-service。编译完成后,目标文件都存与该目录下,打包动作也操作于该目录下。因而产生了排它性。同一时间对xxx-service的发布只能执行一次。

3、部署时,目标机上以存在打包后的文件,解压运行即可。由于web应用的运行需要暴露端口,如80端口,这就使得一台目标机上只能运行一种监听80端口的web应用。

4、目标机即被部署的主机需要有运行web应用的程序以及程序依赖的包。如java应用需要jre(javaruntimeenvironment)。如果web应用使用不同版本的jre,那就需要在目标机上特别处理对不同版本的jre的共存性问题。

典型的发布系统采用过程执行方式,以代码为输入,可用应用或服务为输出对用户进行交付。现有技术的研发环境往往存在环境资源利用率低,资源复用性差,如:一台主机只可部署一个应用或几个同种类型的应用。使用上约束条件多;发布过程中,对部署环境一致性要求高,存在不可避免的环境一致性维护成本;同时,发布过程中涉及多团队配合,每个阶段由不同团队处理,在所难免地带来信息传递失真,以及环境设置上的偏差等问题。



技术实现要素:

本发明为应用发布提供了一整套解决方案,即:以研发流程为主干,docker容器为载体,整合环境资源,支持将web应用发布在一个利用率高、伸缩性强的研发环境内,解决了以下技术问题:

1、闭合依赖,web应用本身与其所依赖的环境因素闭合在镜像内,做到了“一个镜像,各处可跑”。省去了web应用发布时,需要罗列一系列的依赖说明给到运维团队,即二次操作,该典型场景可能由于依赖说明缺失、操作人员理解偏差等主观因素造成发布失败。而一个镜像完全自包含,一条命令在容器内加载即可运行。

2、简化操作,一键发布web应用。web应用发布流程,可固化成既定的操作步骤,以表单形式录入必要信息,如:应用名称、代码分支、部署主机等,点击提交后一键触发整个发布流程。

3、提升发布效率,发布流程支持并发处理。并非所有的web应用之间都存在相互依赖关系,即发布应用b前必须先发布应用a。同类web应用可同时发布。

4、统筹环境资源,高效地利用主机资源。典型的部署场景:一台主机上部署一个web应用。这是由于应用对主机资源的占用具有排它性,如端口;以及运维策略上的考虑。而利用docker容器化技术,有效地将各个web应用闭合在各自的容器之内,并实现应用级别的相互隔离。大大的复用了单一主机的资源,降低运维开支成本。

5、疏通业务流程,真正做到continuousdelivery(持续交付)。开发/测试/运维发布基于相同镜像,以流水线式的方式,将同一镜像文件加载于不同宿主机上的容器内,大大提升了交付效率,可支持高频发布。

6、降低环境运维成本,容器可执行于任何流行的linux主机上,降低使用环境的限制,有效利用存量环境资源。

本发明中应用是指web应用(网络应用,基于互联网提供的应用或服务)。本发明采用的技术方案如下:

一种基于docker的web应用一键发布方法,包括以下步骤:

步骤1,制作镜像:将基础镜像、依赖的工具包、打包后的目标文件以及入口脚本程序写入dockerfile,通过命令生成指定镜像;

步骤2,打标镜像和推送至镜像仓库;

步骤3,部署容器:包括修改docker编排文件和执行编排。

进一步地,所述步骤1具体包括以下步骤:

步骤11,选择应用:将web应用的代码克隆到编译环境;

步骤12,拉取代码分支:切换为所需代码分支;

步骤13,编译:通过执行“主编译脚本”实现编译,输出编译后的目标文件或者通过jenkins实现并发编译,输出编译后的目标文件;

步骤14,打包:将编译后的目标文件进行目标或者文件结构调整后,压缩打包,存放于dockerfile中指定的目录下;

步骤15,进入dockerfile中指定的目录,执行dockerbuild-tappname.命令生成指定镜像。

进一步地,所述编译环境为具备编译工具的一台主机,或者是jenkins集群上的一个node中的一个执行器。

进一步地,所述步骤13中,“主编译脚本”相当于一个main()函数,不同编译类型存在于各个判断分支内,每个编译类型有各自差异化的编译步骤,jenkins实现编译可以集成该“主编译脚本”,以传参区分编译类型;亦可依据不同编译类型,设置对应的基准编译任务模版实现。

进一步地,所述步骤13中,通过jenkins实现并发编译具体包括以下步骤:通过jenkins提供的restapi触发已经在jenkins上注册的任务,被触发的任务被master调度到一个node中的一个执行器中执行。

进一步地,所述步骤2中打标镜像即为镜像打个标签,以区分同一镜像的不同版本,所述标签包括时间戳和代码分支名。

进一步地,步骤2中通过dockerpushappname:tagname命令推送至镜像仓库。

进一步地,步骤3中docker编排文件依次启动两个容器,一个为包含web应用的容器,另一个为包含作反向代理的容器。

进一步地,步骤3中通过docker-composeup命令执行编排,使用docker-composeps查看编排执行状态,完成所述两个容器的部署。

进一步地,步骤3中通过“阿里云”提供的openapi执行编排,通过图形界面监测编排进展以及查看两个容器的运行状态。

本发明的有益效果如下:

1、本发明使用jenkins(jenkins是一个开源软件项目,是基于java开发的一种持续集成工具)执行编译。jenkins执行编译时,以任务方式调度,该任务运行指定node的空闲执行器(buildexecutor)内。做到了多个编译任务时相互隔离。在任务配置中可指定不同的编译工具及工具版本。综上,既做到了多个编译过程互不影响,又统一管理了编译工具。

2、上一点提及各个任务执行于执行器,相互隔离,这就规避了在同一系统目录下执行打包操作的问题。

3、本发明将web应用运行于docker容器内,使得多个web应用启动时可监听同一端口,这是docker容器相互隔离的特性,即闭合性。同时,将多个web应用的内部端口映射到宿主机的不同端口,这样大大复用了单一主机的系统资源。

4、docker容器相互隔离的特性,使得不同容器内可按需运行不同类型的web应用,可以是java应用,node应用等等。而宿主机上不需要安装任何运行程序。

5、特别的,本发明支持一键发布。不但支持发布单个web应用,而且集成了web应用的依赖关系,支持一键发布整套关联web应用。体现了用户关怀。

附图说明

图1是本发明基于docker的web应用一键发布方法流程概要图。

图2是本发明编译阶段的一种实施例。

图3是本发明部署容器的一种实施例。

具体实施方式

本发明利用docker这种进程级别的容器化技术实现web应用编译,打包,构建,部署的一整条业务流程自动化处理,与测试环境基本无耦合,有效整合测试环境资源的效果,并支持一键发布web应用。下文中,结合附图和实施例对本发明作进一步阐述。

图1是本发明基于docker的web应用一键发布方法流程概要图,包括“制作镜像”,“推送至镜像仓库”以及“部署容器”三个步骤。每个步骤下又可进一步细化,下文将详细叙述整个发布流程及其实施例。

步骤1,制作镜像

基于dockerfile制作镜像。将基础镜像、依赖的工具包、打包后的目标文件以及入口脚本程序写入dockerfile,通过dockerbuild-tappname.命令生成指定镜像。具体包括以下步骤:

步骤11,选择应用

将web应用的代码通过gitclone克隆到编译环境。所述编译环境可以是具备编译工具的一台主机,或者是jenkins一个node(jenkins的一个节点)中的一个任务执行器(buildexecutor)。

步骤12,拉取代码分支

切换为所需代码分支。

步骤13,编译

通过执行“主编译脚本”实现编译,输出编译后的目标文件。“主编译脚本”相当于一个main()函数,不同编译类型存在于各个判断分支内,每个编译类型又有各自差异化的编译步骤,所有以“子编译脚本”的形式组织。

可选地,通过jenkins实现并发编译,如图2所示。通过jenkins提供的restapi触发已经在jenkins上注册的任务,执行在jenkins集群之上。被触发的任务会按照一定规则被master调度到一个node中的一个执行器中执行。各个执行器相互隔离,实现了并发编译互不影响。

步骤14,打包

将编译后的目标文件进行必要的目录或文件结构调整后,压缩打包,存放于dockerfile中指定目录下,以便生成镜像是拷贝。

步骤15,生成镜像

进入dockerfile所在目录,执行dockerbuild-tappname.命令生成镜像。

步骤2,打标镜像和推送至镜像仓库

1)打标镜像

打标即为镜像打个标签,即为同一镜像为区分不同的版本而打个标签。使用时间戳+代码分支名的组合作为一个标签,例如:20170724.115422.master。

2)推送至镜像仓库

通过dockerpushappname:tagname命令推送至远程镜像仓库。至此本发明的发布对象已经就绪。

注:

1)默认该镜像仓库已经创建,且制作镜像环境拥有访问及操作权限。

2)本发明使用“阿里云”私有镜像仓库维护所制作的镜像。

3)本发明使用“阿里云”提供的docker编排服务。本质上“阿里云”对开源的docker编排技术作了一层封装。结合“阿里云”集群使用。

步骤3,部署容器

1)修改docker编排文件

每个web应用在本发明实现的这个发布系统都会有一个docker编排文件。这个文件可以作为一个配置文件进行管理。每次部署时,更改image:′registry.cn-beijing.aliyuncs.com/xxx/backend-service:20170725.162538.master′tag部分即可。以下给出一个docker编排文件的实施例:

可以发现:所述编排文件依次启动了两个容器,一个为包含web应用的容器,另一个为包含作反向代理的容器。

图3展示了部署容器的一种实施例。其中“nginx集群”包含n个外部nginx(反向代理服务器程序)服务器,该部分一般由运维团队规划设置,需告知运维团队web应用部署的宿主机ip地址,以及暴露端口号,以便在“nginx集群”中的特定nginx服务器上设置upstream。这样,一次用户请求,例如:https://app1.example.com才能被正确分发至“主机集群”里特定主机上的对应容器,完成交互。

2)执行编排

通过docker-composeup命令执行编排,使用docker-composeps查看编排执行状态,完成以上两个容器的部署。至此,一次典型的发布完成。可选地,使用“阿里云”提供的openapi进行编排执行,可以通过图形界面监测编排进展以及查看容器运行状态。

本发明使用docker容器化技术,结合jenkins持续集成平台,将web应用发布流程高度自动化,通用化。本发明优选java,shell或python作为变成语言。

本发明虽然已以较佳实施例公开如上,但其并不是用来限定本发明,任何本领域技术人员在不脱离本发明的精神和范围内,都可以利用上述揭示的方法和技术内容对本发明技术方案做出可能的变动和修改,因此,凡是未脱离本发明技术方案的内容,依据本发明的技术实质对以上实施例所作的任何简单修改、等同变化及修饰,均属于本发明技术方案的保护范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1