以上指令增加了两个volume,将/home/myWebApp挂载到容器中的/usr/local/tomcat/webapps/ROOT,将/home/myWebAppLogs挂载到容器中的/usr/local/tomcat/logs路径。容器启动后,tomcat的根应用将会是myWebApp(通过本机ip:8888访问),并且tomcat的日志将会输出到/home/myWebAppLogs路径下。
此后,如果容器被删除,应用和应用的日志也不会随容器一起删除。更新应用时,只需要更新/home/myWebApp路径,再重启容器即可。
如果不想把应用挂载到根目录下,可以更改volume配置,比如:-v /home/myWebApp:/usr/local/tomcat/webapps/myWebApp,再通过本机ip:8888/myWebApp访问。
注意:如果想把myWebApp内部的日志也输出到/home/myWebAppLogs路径下,请配置myWebApp的日志文件的输出路径为Tomcat日志路径(相对路径),���如:logs/myLog.log。这样,myWebApp的日志文件将会输出至/usr/local/tomcat/logs下(因为挂载了volume,其实是输出到/home/myWebAppLogs路径下)。
从规范的角度讲,其实这种应用部署方式并不值得推荐,因为部署还是出现了环境相关性。也就是说,必须先把应用目录、日志目录指定好,才能进行部署。而且如果要一台机上要部署两个相同的应用进行负载均衡也比较麻烦(要建两套应用和日志目录,并且修改容器启动命令),难以实现自动化部署。但话又说回来,我相信这种部署方式还是会受到大部分人欢迎的。目前我们公司在测试环境中也普遍使用这种模式,以便一台测试服务器部署多个应用(Tomcat),彼此之间完全没有关联和影响。
如果要做到完全环境无关性部署,可以考虑自己在官方Tomcat镜像的基础上,构建出一个新的镜像。在这个新镜像的Dockerfile中直接下载并部署myWebApp,并使用某些工具或框架,将Tomcat和myWebApp产生的日志,上传汇总到一个统一的日志服务中。这样,如果要再部署一个相同的应用,只要给我一台装有Docker环境的机器,我执行一条指令即可(同一Docker环境下注意端口冲突)。这种方式有利于自动化部署,在服务器数量较多的情况下比较合适。当然,这种方式也有比较麻烦的地方,就是每发布以一个应用版本,都要重新构建一个新的镜像。
关于自动化部署,还可以参考Docker Compose和Kubernetes,这里不做深入(主要是本人对这块的了解和应用也不够多)。
官方镜像的不足
在本镜像的实际使用过程中,还是遇到了一些问题:
1.为了照顾到全球的镜像使用者,官方的openjdk镜像和Tomcat镜像都没对时区进行定制化配置,默认为UTC时间(比北京时间早八小时)。如果应用内部也没有进行时区配置,那么应用获取到的系统时间也将会是UTC时间。
2.在某些机器(或虚拟机)上,jdk的随机数生成器初始化用时过长,导致Tomcat启动用时过长。我用过的阿里云ECS就是这种情况。
这些问题将会在之后我们自己构建的Tomcat镜像中解决。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
更多Docker相关教程见以下内容:
Docker安装应用(CentOS 6.5_x64)
Ubuntu 16.04 服务器上配置使用 Docker
在 Ubuntu 15.04 上如何安装Docker及基本用法