作者:叶子
学习docker搭建测试环境断断续续也有三个多月了,希望记录一下这个过程。常言道,总结过去,展望未来嘛~文章浅显,还望各位大神路过轻拍。
按照国际惯例,先说一下背景:
目前我所处的项目组不断扩大和发展,因此质量保障维度也需要不断扩展。然而多种质量保障维度的开展需要多套测试环境的支持,目前项目组里只有一套测试环境,按照传统方法一步步手工搭建测试环境费时费力,有什么方法可以迅速搭建环境呢?当然是近几年大火的docker啦。可是我是docker小白,之前只是简单地看过几篇docker入门的帖子,去官网上按照tutorial敲了一遍命令,但总感觉是纸上谈兵,一到实战环节,依然无从下手。
中国首富王健林说:“先定一个小目标“。我们的项目里面除了java web应用就是java app应用,java web应用说白了就是tomcat么,以前自己手动部署过,看上去不会太难,那就从这个开始,先用docker部署一个项目中的tomcat应用好了。docker方面的知识是零基础,老大推荐了一本书叫《第一本docker书》。

这本书浅显易懂,适合我这个小白,粗粗读完前4章后,我就感觉自己可以上路了。
测试环境的应用模块部署都是在ndp平台上部署的,先简单了解下ndp平台部署web应用的原理,就是将代码从git上拉下来,编译打包好,找一台云主机,这台云主机上安装了jdk和tomcat,然后把打包好的代码放进tomcat里,设置下端口号,启动起来就好了。那如果用docker怎么部署呢?读完docker书就知道,其实一个docker容器就相当于一台云主机,我们的云主机是linux系统,拉一个linux系统的镜像,启动这个镜像的容器后,我在里面装个jdk和tomcat,这不就和我们的云主机环境一模一样了嘛~
到这里思路就清晰多了,第一步先搞个和云主机环境一样的docker容器,网上搜了一下后,发现直接就有现成的tomcat镜像,tomcat本身也依赖jdk,而且也是基于linux环境的,第一步立马就做完了,这速度杠杠滴。那接下来就是拉取代码,编译打包,然后放进去启动就可以了。于是乎,第一个问题就碰到了,代码是有权限的,不是随便就可以拉取的。回想以前在云主机上拉取代码,是在这台云主机上生成一对ssh密钥,然后把公钥上传到git lab上,这样就能获得拉取代码的权限了。都说实践是检验真理的唯一标准,赶紧在刚刚启动的docker容器里试了一把,恩,行得通!可是这才一个docker容器啊,如果我再来几个docker容器,每个容器都要生成一对ssh密钥,然后上传,岂不累死。 怎么办呢?马克思主义哲学说道过,要透过现象看本质,git识别权限的本质是什么?是在于私钥和公钥的匹配!公钥在git服务器上,那我本地只要有对应的私钥就可以了呀,我在创建容器的时候把一个git已有的公钥所匹配的私钥放进去,这样容器就自带git权限了嘛。
代码拉下来以后,下一步就是编译打包,那先研究下ndp平台是怎么部署我们测试环境的web应用的吧。看了一下,在ndp平台上找到了这个web应用的一个build.xml,咦,这不就是ant工具的执行脚本么,仔细一读,果然是个编译打包的脚本,其中关键的步骤是利用mvn clean install进行编译打包的。ok,那在刚刚启动的容器里安装一下ant和maven工具,然后用ant命令执行下这个build.xml,大功告成!
执行完ant命令以后,发现生成了一个compressed的文件夹,里面主要是编译打包后生成的东西,如下图:
那么这些编译打包好的东西应该放在哪里呢?再一次研究一下ndp部署的tomcat应用的目录层级,心里估摸着我把docker容器中的目录层级弄得和ndp一样应该不会有什么问题。经过对比发现,compressed文件内容和测试环境tomcat应用的webroot文件内容是一样的,吼吼~
此外,其他目录层级不一样的地方罗列了一下,大概有如下几个:

大致读了读,tomcat是个脚本文件,用于启动tomcat服务用的,里面调用了./default/tomcat、init-functions和ratatelogs文件,那就把这些需要的文件都拷贝过来,并确保tomcat脚本里所有的调用路径都正确。
另外还需要修改的server.xml,将docBase地址指定为compressed的绝对路径
将两边目录层级弄的一模一样后,就到了见证奇迹的时刻,运行启动命令:
./tomcat start
查看日志发现正常启动,并无异常报错,这真是个好兆头。再用浏览器试试是否能访问成功,看到预期的网页打开了:)至此,第一个用docker方式部署的web应用模块就完成啦
鉴于项目里有多个不同的web模块,它们所依赖的基础环境都一样,因此打算构建一个基础镜像,将所需要的相同的配置文件都放入基础镜像中,然后各自模块的编译打包过程写成一个Dockerfile,这样就不用在容器里手敲命令进行编译打包了,Dockerfile伪代码如下:
FROM tomcat 基础镜像git clone 代码COPY build.xml, 配置文件等到容器里指定的路径RUN build.xml,生成打包文件COPY 打包文件 TO destination filestart 启动运行模块
web应用搞定后,接下来就是java app模块了。看了一下环境依赖,只需要装个jdk环境就行,然后ndp上同样有java app的构建脚本build.xml,再研究下npd部署的java app的目录结构,该拷贝的拷贝,该修改的修改,照猫画虎弄一遍,也启动成功了。
接下来就是优化下tomcat和java app这两个基础镜像,然后再写写各自模块的Dockerfile就行了
