构建 Tomcat 镜像,运行 war 项目(jenkins)

目录

一、概述

二、编写Dockerfile

1、Dockerfile内容        

2、docker-entrypoint.sh 内容

3、setenv.sh 内容

4、context.xml 内容

三、构建镜像

四、验证构建结果


一、概述

        基于openjdk基础镜像,使用非root用户安全构建tomcat镜像,并将自定义的项目导入到tomcat运行,这里使用 jenkins 项目作为例子,并将加入可自定义的 JVM 等优化参数,优化 关于 运行 jenkins 因 缓储空间不足异常告警问题 。

        其次在kubernetes运行该tomcat镜像可方便通过 configMap 形式挂载 tomcat 配置文件如server.xml 、context.xml 以及 JVM 参数 setenv.sh ,并且可通过修改 挂载的 configMap 配置文件达到修改 tomcat 配置信息,而不需要通过修改Dockerfile重新构建镜像。

二、编写Dockerfile

        Dockerfile涉及的文件内容文件有:

  1. Dockerfile主文件
  2. docker-entrypoint.sh 启动文件 
  3. context.xml tomcat全局配置文件
  4. setenv.sh  JVM参数文件
[root@test tomcat]# pwd
/opt/tomcat
[root@test tomcat]# 
[root@test tomcat]# tree
.
├── context.xml
├── docker-entrypoint.sh
├── Dockerfile
└── setenv.sh

0 directories, 4 files
[root@test tomcat]# 

1、Dockerfile内容        

## cat Dockerfile
## 构建 tomcat 镜像

##  使用的基础镜像

FROM docker.io/library/openjdk:8u102-jdk

## 作者信息,label相关信息是随便写的,仅做参考
LABEL "作者"="fanqietudou"  mail="[email protected]"

## 设置为中国时区 和 中文字符

RUN     rm -vf /etc/localtime \
     && ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
     && echo "Asia/Shanghai" > /etc/timezone \

#   设置系统支持中文,前提是基础镜像支持
     && export LANG=zh_CN.UTF-8 


## 官网下载 tomcat 安装

RUN     curl -k  https://dlcdn.apache.org/tomcat/tomcat-8/v8.5.82/bin/apache-tomcat-8.5.82.tar.gz -o /tmp/apache-tomcat-8.5.82.tar.gz \
     && tar -xzf /tmp/apache-tomcat-8.5.82.tar.gz -C /opt \
     && ln -s /opt/apache-tomcat-8.5.82 /opt/tomcat \
     
##  创建用于临时存放 tomcat 配置的目录,方便使用k8s 挂载 配置,当该目录存在自定义挂载的 configMap 配置才生效,否则使用tomcat构建时默认的配置

     &&  mkdir -p /opt/tomcat/configmap \

#   删除安装包

     &&  rm -rf /tmp/*
     

#  tomcat 环境变量

ENV TOMCAT_HOME /opt/tomcat

##########################################################################################################################################
#
# tomcat 基于 redis 实现会话保持
# 需要下载开源的 插件
# 插件的 github地址 : https://github.com/jcoleman/tomcat-redis-session-manager
# 将commons-pool2-2.2.jar、jedis-2.5.2.jar、tomcat8.x-redis-session-manager.jar(根据tomcat版本对应)上传至服务器tomcat安装路径下的lib文件夹下
# 然后 修改 context.xml 配置即可,具体方案可自行 该 github 或其他参考,此处不做过多解释 
#
##########################################################################################################################################

# 替换 tomcat 默认配置信息,已做基础优化

#ADD     server.xml  $TOMCAT_HOME/conf

ADD     setenv.sh   $TOMCAT_HOME/bin

# 修改了tomcat的缓存,解决 jenkins 启动报错 cacheMaxSize 缓存可用空间不足问题 

ADD    context.xml  $TOMCAT_HOME/conf/context.xml

#  添加 tomcat 启动文件,该文件 主要是判断 configmap 是否存在自定义配置,并启动tomcat

ADD     docker-entrypoint.sh $TOMCAT_HOME/bin

#   setenv.sh 是 tomcat jvm等参数配置, 使用 setenv.sh 就不需要 直接修改 tomcat 的启动文件 catalina.sh

RUN     chmod a+x    $TOMCAT_HOME/bin/setenv.sh $TOMCAT_HOME/bin/docker-entrypoint.sh

###########################################################################################################################
# 运行 jenkins 作为 项目列子 , 如果需要,请修改成 自己的项目,我这里以 jenkins为例
#  注意 由于 不同项目对 jdk 版本的需求不一样,对于不同的 项目要按实际 更改 对应版本的 jdk 基础镜像

RUN     rm -rf $TOMCAT_HOME/webapps/*   \
     && cd $TOMCAT_HOME/webapps \
     && curl  -k https://mirrors.tuna.tsinghua.edu.cn/jenkins/war-stable/2.346.3/jenkins.war -o jenkins.war

###########################################################################################################################

# 添加 启动 tomcat的 用户 tomcat, 由于安全原因不直接使用 root启动 tomcat

RUN      useradd  -m tomcat \

## 修改 tomcat 属组权限

      && chown -R tomcat.tomcat $TOMCAT_HOME /opt/apache-tomcat-8.5.82 

# 设置 tomcat 应用的默认工作目录

WORKDIR $TOMCAT_HOME

# 暴露端口

EXPOSE 8080

# 启动用户

USER tomcat

# 执行启动脚本,构建镜像时不执行,运行实例才会执行

ENTRYPOINT      ["/opt/tomcat/bin/docker-entrypoint.sh"]
# ENTRYPOINT    /opt/tomcat/bin/docker-entrypoint.sh

2、docker-entrypoint.sh 内容

#!/bin/bash

## cat docker-entrypoint.sh

# 启动文件

# 判断是否 挂载自定义的 配置文件( context.xml 、server.xml 和 setenv.sh )

export TOMCAT_HOME=/opt/tomcat

if [ -f $TOMCAT_HOME/configmap/context.xml ];then
        cp  -f $TOMCAT_HOME/configmap/context.xml $TOMCAT_HOME/conf/context.xml
fi
   

if [ -f $TOMCAT_HOME/configmap/server.xml ];then
        cp  -f $TOMCAT_HOME/configmap/server.xml $TOMCAT_HOME/conf/server.xml
fi

if [ -f $TOMCAT_HOME/configmap/setenv.sh ];then
        cp  -f $TOMCAT_HOME/configmap/setenv.sh $TOMCAT_HOME/bin/setenv.sh
        chmod a+x $TOMCAT_HOME/bin/setenv.sh
fi

## 注意要先 cd 切换到 $TOMCAT_HOME/bin 再执行 catalina.sh run 命令(前台启动tomcat),否则会在启动tomcat 时候会发生告警 no such file (这些告警跟 JVM 参数的 gc 等目录有关,影响不大)

cd $TOMCAT_HOME/bin && $TOMCAT_HOME/bin/catalina.sh run

3、setenv.sh 内容

#!/bin/bash

# cat setenv.sh

# 由于tomcat 基础镜像 已存在 jdk,所以不需要自己安装jdk和制定jdk 环境变量
# export JAVA_HOME=/usr/local/jdk1.8.0_181
# export JRE_HOME=/usr/local/jdk1.8.0_181/jre

# 设置 tomcat JVM 参数,容器环境看实际需求情况决定是否需要 配置 gc日志和 内存溢出文件HeapDump
export JAVA_OPTS="-server -Xms1024m -Xmx1024m -Xmn384m -Xss512k -XX:MetaspaceSize=128m \
                  -XX:MaxMetaspaceSize=512m -XX:NativeMemoryTracking=summary \
                  -Duser.timezone=GMT+8 -Dfile.encoding=UTF-8 \
                  -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=../logs/ \
                  -XX:+PrintGCApplicationStoppedTime -XX:+DisableExplicitGC -XX:+UseG1GC \
                  -XX:+PrintAdaptiveSizePolicy -XX:+PrintGCDetails -XX:+PrintGCDateStamps  \
                  -XX:+HeapDumpBeforeFullGC -XX:+HeapDumpAfterFullGC \
                  -Xloggc:../logs/gc.%t.log"

# 该配置是 tomcat 以 apr 方式运行 需要用到的,默认的 NIO 不需要 apr 依赖
#export LD_LIBRARY_PATH=/usr/local/apr/lib:$LD_LIBRARY_PATH
#JAVA_OPTS="$JAVA_OPTS -Djava.library.path=/usr/local/apr/lib"

export UMASK=0022

4、context.xml 内容






    
    
    WEB-INF/web.xml
    ${catalina.base}/conf/web.xml

    
    

   
   

   

   

三、构建镜像

# 在当前 dockerfile 目录执行 构建 镜像命令

docker build -t test/tomcat:v1 . --no-cache

## cd /opt/tomcat && docker build -t test/tomcat:v1 . --no-cache

四、验证构建结果

## 使用 构建成功的镜像 运行 容器 并查看日志

docker run -itd --name testv1  -p 8080:8080   test/tomcat:v1

## 查看 容器日志

docker logs testv1

## 访问 基于 tomcat 的 jenkins 项目

http://docker主机IP:8080/jenkins


### 获取 jenkins admin 的密码

docker exec  testv1  cat /home/tomcat/.jenkins/secrets/initialAdminPassword

### docker logs testv1 |grep -C 5 initialAdminPassword

你可能感兴趣的:(tomcat,jenkins,java,kubernetes,docker)