构建 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="123456@qq.com"

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

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 内容

<?xml version="1.0" encoding="UTF-8"?>
<!--
       Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->
<!-- The contents of this file will be loaded for each web application -->
<Context>

    <!-- Default set of monitored resources. If one of these changes, the    -->
    <!-- web application will be reloaded.                                   -->
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>

    <!-- Uncomment this to disable session persistence across Tomcat restarts -->
    <!--
             <Manager pathname="" />
    -->

   <!-- 配置 tomcat 缓储值,解决如 jenkins 缓储空间不足异常告警等问题 -->
   <Resources
   cachingAllowed= "true"
   cacheMaxSize= "200000"
   />

   <!-- 此配置是基于redis 实现 session 共享 前提是在构建Dockerfile镜像时候已导入 共享session 的 jar 就可以打开 该注释,并修改成自己的 配置信息 -->

   <!--
        <Valve className="com.naritech.nicole.gump.RedisSessionHandlerValve" />
        <Manager className="com.naritech.nicole.gump.RedisSessionManager"
                host="114.114.114.114"
                port="6379"
                database="0"
                password="redispwd"  />

    -->
</Context>

三、构建镜像

# 在当前 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值