测试环境docker化(一)—基于ndp部署模式的docker基础镜像制做

本文来自网易云社区html

做者:孙婷婷java


背景git

我所在测试项目组目前的测试环境只有一套,在项目版本迭代过程当中,开发或产品偶尔会在测试环境进行数据校验,QA人数在不断增长,各我的员在负责不一样模块工做时也会产生脏数据,致使QA在功能测试和接口测试过程当中须要清理测试环境增长工做量,同时QA组在进行异常测试等多维度质量保障时也但愿有多套环境进行数据隔离。但目前测试环境多套隔离操做麻烦,每隔离一套环境须要修改大量配置、数据库从新建表到调试可用,在开发的帮助下至少须要3天的时间,在这种场景下,咱们借鉴组内大数据QA的思路和探索路线,考虑尝试引入docker技术来解决测试环境问题。web

在实践测试环境docker化的过程当中,考虑到项目的部署流程都已经迁移至运维的ndp平台,因为项目属于多模块项目,同时为尽可能保证docker化后的测试环境能与现有生产环境的配置和结构保持一致,咱们设计借鉴ndp的发布配置和模式进行docker化后的测试环境部署。docker


ndp部署流程数据库

通过学习、对比和摸索,了解到ndp的部署流程基本以下图所示(基本都是本身摸索,未专门请求运维同事,若是运维部的同事发现有错误,欢迎指正(*^▽^*))tomcat

  1. 用户在ndp管理平台配置代码地址、构建文件build.xml、部署定制配置(主要配置端口号、内存分配、应用名、应用入口等)安全

  2. 当点击项目构建时,ndp服务器会拉取代码,而后按照编写的构建文件build.xml对项目模块进行ant构建,模块构建完成后进行模块打包服务器

  3. 当点击项目部署时,将打包模块分发至部署服务器,进行项目部署app

基于以上背景,考虑设计docker化的环境发布接口为1个compile容器+多个deploy模块容器接口,首先启动一个compile容器完成全部模块的编译,并启动一个httpServer发布端口号,而后逐个启动deploy容器,拉取打包模块完成整个项目部署。所以,首先须要设计compile和deploy两类基础镜像。

基础编译镜像compile

  1. 咱们的镜像使用Dockerfile制做,首先安装项目编译须要的软件,包括jdk(注意是jdk不是jre)、ant、maven,其中,maven须要配置公司的依赖仓库,所以能够经过COPY将公司的settings.xml放入镜像中相应位置;

  2. 容器经过git下载代码时须要ssh权限,能够经过找一台服务器生成一个ssh-key,公钥放入git上相关项目的deploy-key中获取下载权限,私钥经过COPY放入镜像root下的.ssh文件中;

  3. 机器首次git clone代码时git会提示“Are you sure you want to continue connecting (yes/no)?”,因为须要容器运行后自动下载代码编译,中间不须要任何人工操做,则须要去除这条提示,经过网上搜索,解决办法是能够修改/etc/ssh_config文件中的配置来跳过此处询问,以下所示去掉文件中“StrictHostKeyChecking”前的“#”。能够事先修改好配置,经过COPY替换镜像中相应文件便可。

#   CheckHostIP yes#   AddressFamily any#   ConnectTimeout 0
    StrictHostKeyChecking no#   IdentityFile ~/.ssh/identity

将以上操做经过Dockerfile命令方式写入后运行docker build就能够生成咱们定制的compile镜像,建立容器时经过挂载的方式将项目各模块的build.xml加载到容器中,指定容器运行代码为一个entry.sh文件,该entry.sh主要实现代码拉取、各模块ant构建和最后启动一个httpServer的功能,启动httpServer后compile容器即发布成功!


基础部署镜像javaappp和tomcat

因为项目中模块基本都是javaapp和javaweb项目,咱们就考虑制做了两个镜像,一个为javaapp镜像,专门用于部署javaapp模块,对应于ndp上的应用类型为java app;一个为tomcat镜像,专门用于部署java web模块,对应于ndp上的应用类型为java web。

a. javaapp镜像

  1. javaapp镜像主要用于运行javaapp应用,只须要有jre环境便可,所以首先安装jre;

  2. 将现有测试环境服务器部署模块中生成的config文件放入自定义路径下,该文件用于定制化jvm参数、内存分配、应用名、端口号等,对应ndp上模块-配置-发布配置页面内容,以下图

   3. 将现有测试环境服务器部署模块中的appCtrl.sh经过COPY放置在自定义路径下,该文件为调用config参数后启动java的项目启动文件,须要启动项目时只需运行./appCtrl.sh start便可,具体其余功能可学习该文件。

建立容器时经过挂载的方式将entry.sh文件加载到容器中,该entry.sh主要实现从compile容器拉取部署模块、修改config配置(增长特定入口main方法)和启动appCtrl.sh的功能,启动模块后该模块容器即发布成功!


b. tomcat镜像

  1. 因为web项目须要使用tomcat,镜像首先安装jre和tomcat

  2. 将现有测试环境服务器部署模块中的default_tomcat文件放入自定义路径下,该文件用于定制化内存分配、应用名、端口号等,对应ndp上模块-配置-发布配置页面内容

  3. 修改tomcat中server.xml,主要是将docBase的路径指定为后续打包模块的存放路径,好比我是指定为"/usr/local/compressed"(因为一个容器中只会运行一个模块,因此此处可固定填写)

  4. 将现有测试环境服务器部署模块中的用于tomcat服务启动的tomcat脚本文件放入自定义路径下,该文件相似于javaapp镜像中的appCtrl.sh文件((需删除java、修改start-stop-daemon路径))。同时因为该文件调用了init-functions和rotatelogs,需修改init-functions的调用路径为系统文件路径,并在自定义路径下加入rotatelogs用于日志切割

建立容器时经过挂载的方式将entry.sh文件加载到容器中,该entry.sh主要实现从compile容器拉取部署模块、修改配置和启动tomcat的功能,启动模块后该模块容器即发布成功!


总结  

此部署结构和镜像一方面对标了ndp的环境部署方式;另外一方面,部分jar包会被其余其余模块依赖,但基于安全缘由未上传至仓库,而是先打包后给其余模块使用,此时集中在一个容器中打包则不须要在各个模块编译的时候重复打包依赖jar包;同时保证各个模块属于同一个版本的代码,保证每套环境部署时各个模块的版本一致性。

从目前实践结果来看,本组项目已基本完成各个模块的容器发布,只要一套环境发布的各个配置文件、build.xml、entry.sh整理好,便可实现三行命令发布一套环境的需求,大大缩减了测试环境部署时间。故在这里写出来给有须要的小伙伴参考,也但愿有相似经历的同事能够多提建议,多多指教。


有实践就会有坑,此处简单罗列镜像制做过程当中的各类奇怪的坑,以免伙伴们重复踩坑!

1. 在tomcat镜像制做过程当中,使用的基础镜像是docker-library中的tomcat的Dockerfile,可是该镜像在执行过程当中会再安装一遍jdk,在安装后删除致使build到一半时找不到jdk,解决方法:删除从新安装的代码。

2. ndp上build.xml中的执行工具mvn的名称默认为服务器中的mvn名称“mvnJDK7”,须要修改成咱们安装在镜像中的mvn名称,通常为“mvn”。

3. 注意修改各COPY到镜像中的可执行文件的执行权限,如rotatelogs/config/default-tomcat等

4. 在compile+deploy结构中,我最终在compile容器中起了一个httpServer,各deploy经过wget获取编译后的文件夹,可是若文件夹中有index.html,wget会默认读取index.html及index.html中的连接文件,这样就违背了我但愿获取全部文件的预期,最后解决办法是先将文件夹压缩,经过wget获取后再解压

5. 容器入口使用entry.sh运行,最后运行完./tomcat start或./appCtrl start后会退出容器,缘由是docker容器中的前台线程结束即会退出。解决办法,能够在脚本最后添加命令“tail -f /dev/null”使线程始终挂起。


网易云容器服务为用户提供了无服务器容器,让企业可以快速部署业务,轻松运维服务。容器服务支持弹性伸缩、垂直扩容、灰度升级、服务发现、服务编排、错误恢复及性能监测等功能,点击可免费试用


网易云免费体验馆,0成本体验20+款云产品!

更多网易研发、产品、运营经验分享请访问网易云社区


相关文章:
【推荐】 Wireshark对HTTPS数据的解密

相关文章
相关标签/搜索