这是我参与8月更文挑战的第4天,活动详情查看:8月更文挑战
何谓传统项目
本文的传统项目指的是上古技术时代遗留下来的项目,通常具有以下特点:
- 采用
Strues2+Spring+Hibernate/Mybatis框架搭建 - 使用
war包部署 - 配置文件通常放置于
tomcat的lib目录下
解决思路
根据上面的特点,我们可以指定出镜像应符合以下特点:
- 基础镜像来源与
Tomcat - 配置文件不能放置于镜像内,因为会涉及到手工修改
war包不放置于镜像内,方便修改某些静态文件信息
着手实施
有了解决思路后,我们就来写DockerFile文件。
# VERSION 0.1
# Author: stopthink
#基础镜像
FROM tomcat:8.5-jre8
#作者
MAINTAINER stopthink
#定义工作目录
ENV WORK_PATH /usr/local/tomcat
# 配置日志输出
COPY ./logging.properties $WORK_PATH/conf
# 配置配置文件的防止目录为/project/properties
COPY ./setclasspath.sh $WORK_PATH/bin
#删除自带的ROOT包及一些为无用的配置,减少镜像体积
RUN rm -rf $WORK_PATH/webapps/ROOT \
&& rm -rf $WORK_PATH/webapps/docs \
&& rm -rf $WORK_PATH/webapps/examples \
&& rm -rf $WORK_PATH/webapps/manager \
&& rm -rf $WORK_PATH/webapps/host-manager \
&& mkdir -p /project/properties \
&& mkdir -p /project/config
上面的代码我们通过增加classpath路径的方式,以便将原有的配置文件可以放置到我们指定的目录中,而不用非得存在于tomcat的lib目录下,而且我们还在镜像中预留了/project/config目录,方便放置其他的项目配置文件
执行 docker build -t tomcat8:v1.0 .进行镜像构建
注意:
logging.properties和setclasspath.sh文件应和DockerFile处于统一目录下。
时区问题
镜像构建完成后,我们可通过执行下方代码进行镜像测试:
docker run -it --rm -v war包本机路径:/usr/local/tomcat/webapps -v 配置文件本机路径:/project/properties tomcat8:v1.0
我们通过-v命令进行目录挂载,上面的代码中,我们映射了两个路径,一个是war包存放的路径,一个是配置文件存放的路径。
虽然现在项目是可以正常运行的,但当我们查看日志文件时,发现日志的输出时间是比我们当前的时间少的,而且恰好是8个小时,这明显是始去的问题,所以我们需要再次修改DokcerFile文件,增加上时区配置:
# 设置时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime \
&& echo $TZ > /etc/timezone
再次执行构建和运行,时间已恢复正常。
乱码问题
浏览器中访问项目,发现会出现乱码的情况,通过分析可知是因为未正确配置tomcat的编码导致的,所以我们需要修改tomcat的server.xml文件,并将其放置到镜像中,server.xml文件主要修改如下部分:
<Connector port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"
maxThreads="2000" acceptCount="1000" maxSpareThreads="300" minSpareThreads="100"
connectionTimeout="20000"
/>
这个地方也可根据自己项目的实际情况,进行
tomcat调优