構建自己的Tomcat鏡像

在很多情況下,我們會不滿足於官方提供的Tomcat鏡像。比如官方鏡像的時區爲UTC時間,並不是北京時間;再比如在特定硬件環境下,jdk的隨機數生成器初始化過慢問題。此時,我們就會考慮構建自己的Tomcat鏡像,滿足我們實際應用的需要。

構建自己的Tomcat鏡像有多種方式,常用的有兩種

  1. 在官方提供的Tomcat鏡像的基礎上進行構建(以官方Tomcat鏡像爲父鏡像)。官方的Tomcat鏡像已經爲我們做了很多工作,我們只需要修改部分內容即可。

  2. 根據openjdk鏡像,參考官方Tomcat鏡像的Dockerfile文件進行構建。我們可以完全按照自己的需求安裝和配置Tomcat。當然,通過第一種方式也能達到這個目的,這不是本文的重點。

爲了更好地演示Tocmat鏡像的構建步驟,本文將按照第二種方式構建我們自己的Tomcat。我們構建的依據當然是官方Tomcat鏡像的Dockerfile文件,有想了解該文件的內容朋友,可以移步至我的另一篇博客:官方Tomcat鏡像Dockerfile分析及鏡像使用。

我們會對官方的Dockerfile進行一定的精簡,去掉可有可無的指令,並添加我們自定義的指令。當然這個可有可無只是我個人認爲,僅供參考。

改造後的Dockerfile文件

FROM openjdk:8-jre

MAINTAINER [email protected]

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 8080CMD ["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模式。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章