在很多情況下,我們會不滿足於官方提供的Tomcat鏡像。比如官方鏡像的時區爲UTC時間,並不是北京時間;再比如在特定硬件環境下,jdk的隨機數生成器初始化過慢問題。此時,我們就會考慮構建自己的Tomcat鏡像,滿足我們實際應用的需要。
構建自己的Tomcat鏡像有多種方式,常用的有兩種
在官方提供的Tomcat鏡像的基礎上進行構建(以官方Tomcat鏡像爲父鏡像)。官方的Tomcat鏡像已經爲我們做了很多工作,我們只需要修改部分內容即可。
根據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的區別:
去掉了Tomcat Native相關組件。此組件用於支持Tomcat的APR模式,個人認爲一般應用並不需要。
去掉了對下載的Tomcat做簽名驗證的相關內容。我們的Tomcat下載地址已經是官方地址。
增加了對時區的配置。
處理了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模式。