传统项目如何Docker化

316 阅读1分钟

这是我参与8月更文挑战的第4天,活动详情查看:8月更文挑战

何谓传统项目

本文的传统项目指的是上古技术时代遗留下来的项目,通常具有以下特点:

  1. 采用Strues2 + Spring + Hibernate/Mybatis框架搭建
  2. 使用war包部署
  3. 配置文件通常放置于tomcatlib目录下

解决思路

根据上面的特点,我们可以指定出镜像应符合以下特点:

  1. 基础镜像来源与Tomcat
  2. 配置文件不能放置于镜像内,因为会涉及到手工修改
  3. 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.propertiessetclasspath.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的编码导致的,所以我们需要修改tomcatserver.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调优

完整代码

仓库地址:gitee.com/lanrain/art…