在很多情况下,我们会不满足于官方提供的Tomcat镜像。比如官方镜像的时区为UTC时间,并不是北京时间;再比如在特定硬件环境下,jdk的随机数生成器初始化过慢问题。此时,我们就会考虑构建自己的Tomcat镜像,满足我们实际应用的需要。

构建自己的Tomcat镜像有多种方式,常用的有两种

  1. 在官方提供的Tomcat镜像的基础上进行构建(以官方Tomcat镜像为父镜像)。官方的Tomcat镜像已经为我们做了很多工作,我们只需要修改部分内容即可。
  2. 根据openjdk镜像,参考官方Tomcat镜像的Dockerfile文件进行构建。我们可以完全按照自己的需求安装和配置Tomcat。当然,通过第一种方式也能达到这个目的,这不是本文的重点。

为了更好地演示Tomcat镜像的构建步骤,本文将按照第二种方式构建我们自己的Tomcat。我们构建的依据当然是官方Tomcat镜像的Dockerfile文件,有想了解该文件的内容朋友,可以移步至我的另一篇博客:官方Tomcat镜像Dockerfile分析及镜像使用

我们会对官方的Dockerfile进行一定的精简,去掉可有可无的指令,并添加我们自定义的指令。当然这个可有可无只是我个人认为,仅供参考。

改造后的Dockerfile文件

FROM openjdk:8-jre

MAINTAINER dfengwei@163.com

ENV JAVA_HOME /docker-java-home
ENV CATALINA_HOME /usr/local/tomcat
ENV PATH $CATALINA_HOME/bin:$PATH
ENV TIME_ZONE Asia/Shanghai
RUN mkdir -p "$CATALINA_HOME"
WORKDIR $CATALINA_HOME RUN set -x \
\
# 下载Tomcat压缩文件
&& wget -O tomcat.tar.gz 'https://www.apache.org/dyn/closer.cgi?action=download&filename=tomcat/tomcat-8/v8.5.16/bin/apache-tomcat-8.5.16.tar.gz' \
# 解压
&& tar -xvf tomcat.tar.gz --strip-components=1 \
# 删除供Windows系统使用的.bat文件
&& rm bin/*.bat \
# 删除Tomcat压缩文件
&& rm tomcat.tar.gz* \
\
# 更改时区
&& echo "${TIME_ZONE}" > /etc/timezone \
&& ln -sf /usr/share/zoneinfo/${TIME_ZONE} /etc/localtime \
\
# 处理Tomcat启动慢问题(随机数产生器初始化过慢)
&& sed -i "s#securerandom.source=file:/dev/random#securerandom.source=file:/dev/./urandom#g" $JAVA_HOME/jre/lib/security/java.security EXPOSE 8080
CMD ["catalina.sh", "run"]

这个Dockerfile够精简了吧,里面的指令我加了注释,大家应该都能看懂。和官方的Dockerfile相比,虽然看上去是去掉了很多指令,但实际上也是完全够用了的。这里再大致列一下和官方Dockerfile的区别:

  1. 去掉了Tomcat Native相关组件。此组件用于支持Tomcat的APR模式,个人认为一般应用并不需要。
  2. 去掉了对下载的Tomcat做签名验证的相关内容。我们的Tomcat下载地址已经是官方地址。
  3. 增加了对时区的配置。
  4. 处理了Tomcat因随机数产生器初始化过慢而导致启动过慢问题。该问题可能在某些硬件条件下会出现,比如阿里云的ECS。

注意:在增加指令进行定制化改造的同时,也要适当考虑镜像的通用性。

构建镜像

进入Dockerfile所在路径,执行以下命令构造镜像(注意末尾的点不能遗漏):

$ docker build -t dfengwei/tomcat:8.5.15-jre8 .

Docker的build命令这里就不多做解释了,请自行百度或参考官方文档。构建后的镜像存于本机,只能本机使用。

命令中的-t参数用于指定该镜像的标签。标签格式一般是是:用户名/镜像名称:镜像版本号

如果该镜像只是你本地使用,那么标签你可以随意取;但是如果你要使用DockerHub等托管服务托管该镜像,则必须使用托管服务商给你用户名作为标签的用户名,并且镜像名称镜像版本号遵循一定的规则。官方的托管服务是DockerHub,非官方的有很多,比如阿里云的开发者平台。我将在之后的文章中介绍如何操作。

运行容器

$ docker run -d --name tomcat-test -p 8888:8080 dfengwei/tomcat:8.5.15-jre8

本容器的使用方式其实和官方的Tomcat是一样的,只是不支持Tomcat的APR模式。大家可以参考我之前的一篇博客:官方Tomcat镜像Dockerfile分析及镜像使用

构建自己的Tomcat镜像的更多相关文章

  1. OpenShift应用镜像构建(1) S2I tomcat 镜像定制

    参考并感谢https://www.jianshu.com/p/fd3e62263046 在对接项目制作应用镜像的过程中,经常发现避免不了的是需要写Dockerfile,(当然另外一种方式是直接run一 ...

  2. docker dockerfile构建自己的tomcat镜像

    文件 1.apache-tomcat-8.5.24.tar.gz, jdk-8u151-linux-x64.tar.gz Dockerfile文件: FROM centosWORKDIR /usrCO ...

  3. 官方Tomcat镜像Dockerfile分析及镜像使用

    官方Tomcat镜像 地址:https://hub.docker.com/_/tomcat/ 镜像的Full Description中,我们可以得到许多信息,这里简单介绍下: Supported ta ...

  4. 用Docker构建Tomcat镜像

    构建tomcat镜像 创建工作目录 [root@elk-node2 tomcat]# mkdir tomcat [root@elk-node2 tomcat]# cd tomcat [root@elk ...

  5. Dockerfile书写介绍及构建ssh镜像、tomcat镜像、nginx镜像

    =================================================================================================== ...

  6. dockerfile构建Tomcat镜像

    dockerfile构建Tomcat镜像 一.镜像分层概念 二.制作tomcat镜像 2.1.创建分层目录 [root@node2 ~]# mkdir /app/{web/{nginx,tomcat, ...

  7. docker构建tomcat镜像

    下载centos镜像 # docker pull daocloud.io/centos:7 [root@localhost ~]# docker pull daocloud.io/centos: : ...

  8. 使用Dockerfile创建一个tomcat镜像,并运行一个简单war包

    docker已经看了有一段时间了,对镜像和容器也有了一个大致了解,参考书上的例子制作一个tomcat镜像,并简单运行一个HelloWorld.war 1.首先下载linux环境的tomcat和jdk, ...

  9. 使用Dockerfile制作JDK+tomcat镜像

    1.准备好jdk和tomcatapache-tomcat-8.5.32.tar.gzjdk-8u181-linux-x64.tar.gz 注意:a.jdk和tomcat记得从官网下载,否则制作出来的镜 ...

随机推荐

  1. qt添加资源文件方法

    File->new file->file and classes->Qt->qt resources->   add name   add->add prefix- ...

  2. 以太坊RLP用法-go-ethereum学习

    RLP (递归长度前缀)提供了一种适用于任意二进制数据数组的编码,RLP已经成为以太坊中对对象进行序列化的主要编码方式.RLP的唯一目标就是解决结构体的编码问题:对原子数据类型(比如,字符串,整数型, ...

  3. Mac苹果系统 多系统启动:The rEFInd Boot Manager

    苹果系统 多系统启动 下载安装REFIT: 首先安装一下:REFIT, 在这个页面下载: http://refit.sourceforge.net/#download 选择mac disk image ...

  4. Java集合之Properties

    Java集合之Properties

  5. 泛型(java菜鸟的课堂笔记)

                1. 泛型的简单运 用和意义   2. 泛型的上限与下限   3. 泛型和 子类继承的限制   4. 泛型类和泛型 方法   5. 泛型嵌套和泛型擦除             ...

  6. ES6 常用总结——第一章(简介、let、const)

    ES6整理 1. ECMAScript 6简介 ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准.它的目标,是使得 JavaScript 语言可以用来编写复杂 ...

  7. Unslider Web前端框架之图片轮播

    前端框架,前端组件,前端库,都是一个意思,能看源码. 最近做H5小游戏,用到了图片轮播的组件,而且要求支持移动端触屏滑动.一开始用的是nivo slider,但是对大小不一样的图不支持box 的参数设 ...

  8. Error creating bean with name 'signController': Injection of autowired dependencies failed

    出现了一大串错误,Error creating bean with name 'signController': Injection of autowired dependencies failed. ...

  9. JSON字符串和JS对象

    JSON和JS对象 一 JSON是什么 JSON是基于文本的,轻量的,用于数据交换的,一种格式. 可以看到JSON的定义里面有很多的定语,现在就每个限定解释一下: 1. 基于文本 这里的意思是相对于哪 ...

  10. 工程师倾情奉献-Win7 ISO 精简操作说明

    1.前提条件 a)本文档内容只适用于32bit win7 install ISO,其它OS不能保证兼容 b)示范文件为win7-ultimate-rtm-32-en-us-rdvd.iso 2.准备待 ...