在很多情况下,我们会不满足于官方提供的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. java-web中生成文档(一)

    基于Java的解决方案也是很多的,包括使用Jacob.Apache POI.Java2Word.iText等各种方式,其实在从Office 2003开始,就可以将Office文档转换成XML文件,这样 ...

  2. python 收录集中实现线程池的方法

    概念: 什么是线程池? 诸如web服务器.数据库服务器.文件服务器和邮件服务器等许多服务器应用都面向处理来自某些远程来源的大量短小的任务.构建服务器应用程序的一个过于简单的模型是:每当一个请求到达就创 ...

  3. bug 修复:上传库存时前端回发file_name参数丢失;

    # tmp_file = os.path.join(os.path.abspath('youcart/tmp'), json.loads(request.data).get('file_name')) ...

  4. css清除浮动的八大方法

    清除浮动是每一个 web前台设计师必须掌握的机能.css清除浮动大全,共8种方法. 浮动会使当前标签产生向上浮的效果,同时会影响到前后标签.父级标签的位置及 width height 属性.而且同样的 ...

  5. 面向对象的SOLID原则白话篇

    面向对象的SOLID原则 简介 缩写 全称 中文 S The Single Responsibility Principle 单一责任原则 O The Open Closed Principle 开放 ...

  6. angular路由最基本的实例---简单易懂

    <!DOCTYPE html> <html lang="en" ng-app="myapp"> <head> <met ...

  7. [1] MVC & MVP &MVVM

    开发架构之MVC & MVP & MVVM  

  8. scrapy抓取淘宝女郎

    scrapy抓取淘宝女郎 准备工作 首先在淘宝女郎的首页这里查看,当然想要爬取更多的话,当然这里要查看翻页的url,不过这操蛋的地方就是这里的翻页是使用javascript加载的,这个就有点尴尬了,找 ...

  9. JS性能优化之怎么加载JS文件

    IE8+等实行并行下载,各JS下载不受影响,但仍阻塞其他资源下载 如: 图片 所以首要规则就是:将JS放在body底部(推荐) 加载100kb的单个文件比4个25kb的文件快(减少外链文件数量)(脚本 ...

  10. Kafka官方文档翻译——简介

    简介 Kafka擅长于做什么? 它被用于两大类应用: 在应用间构建实时的数据流通道 构建传输或处理数据流的实时流式应用 几个概念: Kafka以集群模式运行在1或多台服务器上 Kafka以topics ...