構建Tomcat映象
在很多情況下,我們會不滿足於官方提供的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 8080
CMD ["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模式。