docker-tomcat&catalina.sh文件介紹


2018-05-04~06

 

1、創建文件夾
$ mkdir mytomcat

2、切換到文件夾,且將下載好的jdk-8u162-linux-x64.tar.gz、apache-tomcat-7.0.85.tar.gz壓縮包拷貝到此目錄下(自行編寫命令)。
$ cd mytomcat

3、生成Dockerfile文件並編輯內容
$ vim Dockerfile
FROM ubuntu:16.04
ADD jdk-8u162-linux-x64.tar.gz /java/
ADD apache-tomcat-7.0.85.tar.gz /tomcat/
ENV JAVA_HOME=/java/jdk1.8.0_162
ENV PATH=$PATH:$JAVA_HOME/bin
EXPOSE 8080
CMD ["/tomcat/apache-tomcat-7.0.85/bin/catalina.sh", "run"]


底層鏡像配置的環境變量、啟動的sh文件,為什么在頂層無效了?用ENV配置變量。

使用startup.sh無法自行啟動tomcat,一定要用catalina.sh,為什么呢,還是有疑問。

調試過程嘗試的命令:
#ADD dockerd  /etc/rc.d/init.d/
#RUN chmod 777  /etc/rc.d/init.d/dockerd
#CMD /etc/rc.d/init.d/dockerd
#CMD /bin/bash
#CMD /tomcat/apache-tomcat-7.0.85/bin/startup.sh
#RUN ps -ef

4、創建鏡像
$ docker build -t mytomcat:v1 .

5、創建容器。為什么有時候容器不會自動啟動?因為沒有加"bash”指令。
$ docker run -it --name mytomcat -d mytomcat:v1

6、檢測容器是否啟動
$ docker ps -a

7、查詢容器對應的ip
$ docker inspect mytomcat

8、在瀏覽器上打開tomcat驗證是否成功
http://172.17.0.2:8080/

9、進入容器驗證jdk服務是否啟動
$ docker exec -it mytomcat bash
root@3729b97e8226:/# ps -ef
root@3729b97e8226:/# exit

 

10、catalina.sh

10.1、catalina.sh的實現。

catalina.sh規格接近600行代碼,這足以嚇退很多人,但如果肯硬着頭皮看幾遍的話,其實可以了解到catalina.sh的代碼並不復雜,可讀性還是很高的。除去catalina.sh中對cygwin、os400的特殊處理,代碼做了如下操作:

  • 加載類路徑,通過加載、執行setclasspath.sh實現。
  • 加載用戶自定義變量,通過加載setenv.sh實現。
  • 校驗變量,包括前述介紹的變量,檢查是否存在定義,如無定義則使用默認值,並依據用途做相應的校驗。
  • 運行命令,依據腳本接收到的選項,將變量拼接為命令,並執行。

10.2、與catalina.sh相關的腳本

tomcat發布版本中附帶了很多腳本,和catalina.sh相關有如下

catalina.sh中的參數 對應/bin目錄下的腳本 作用
version version.sh 查看當前tomcat的版本號
start startup.sh 啟動運行tomcat實例
stop shutdown.sh 停止tomcat實例的運行
configtest configtest.sh 校驗tomcat配置文件server.xml的格式、內容等是否合法、正確
  setclasspath.sh catalina.sh依賴這個腳本來設置一些運行時變量

 

腳本version.sh、startup.sh、shutdown.sh、configtest.sh都是對catalina.sh的包裝,內容大同小異,差異在於功能介紹和調用catalina.sh時的參數不同。下面就重點分析下catalina.sh的實現。

10.3、catalina.sh的命令行選項。

在shell下不帶任何參數來執行catalina.sh,可以看到類似如下的輸出信息。

Usage: catalina ( commands ... )
commands:
debug Start Catalina in a debugger
debug -security Debug Catalina with a security manager
jpda start Start Catalina under JPDA debugger
run Start Catalina in the current window
run -security Start in the current window with security manager
start Start Catalina in a separate window
start -security Start in a separate window with security manager
stop Stop Catalina
configtest Run a basic syntax check on server.xml
version What version of tomcat are you running?

幫助信息給出了各選項的意義,但tomcat提供的封裝腳本中只用到了其中的一部分,比如:

如果需要使用其它命令行選項,最簡單的方法即是復制startup.sh腳本並重命名為新的腳本,使用文本編輯器調整傳給catalina.sh的參數,如此操作之后,滿足自定義需求的腳本即創建好了。


10.4、catalina.sh提供了哪些變量?

用文本編輯器打開catalina.sh,首先可以看到一些環境變量的說明,基於功能可以做如下分類:

  • 指定tomcat和應用的啟動路徑
    • CATALINA_HOME,指向tomcat的安裝路徑,或者腳本catalina.sh所在位置的父目錄。
    • CATALINA_BASE,可選項,如無定義,則與CATALINA_HOME取值相同。用於指向用戶自定義的tomcat路徑,tomcat啟動時將以CATALINA_BASE變量值來計算配置文件、日志文件等的路徑。
  • Java運行時路徑,tomcat運行依賴系統已安裝好的Java運行時軟件,因此如下兩個變量中至少定義一個,並且變量值指向合法路徑。
    • JAVA_HOME,指定JDK的安裝路徑。
    • JRE_HOME,指定JRE的安裝路徑。取值原則,如用戶未指定JRE_HOME,則取JAVA_HOME的值;如JRE_HOME和JAVA_HOME都有定義,則優先取JRE_HOME的定義。
  • Java運行時參數
    • JAVA_OPTS,顧名思義,用來定義傳遞Java運行時的參數,對全部命令行選項都會生效,因此不建議在本變量中定義堆大小、GC參數、JMX參數等。
    • CATALINA_OPTS,用來定義傳遞給Java運行時的參數,僅在命令行選項為run/start/debug時有效,可以用來傳遞堆大小、GC參數、JMX參數等。
    • CATALINA_TMPDIR,用來定義java.io.tmpdir變量的值,默認值為$CATALINA_BASE/temp。
    • JAVA_ENDORSED_DIRS,以分號相隔的目錄列表,用來替換非JCP提供的jar實現,默認值為$CATALINA_HOME/endorsed。
  • 遠程調試參數。當開發環境與應用運行環境不一致,或者開發環境下出於各種原因不適合調試應用時,這時即可借助遠程調試來解決問題。JPDA的介紹可參考閱讀資料。
    • JPDA_TRANSPORT,默認值dt_socket。
    • JPDA_ADDRESS,默認值localhost:8000。
    • JPDA_SUSPEND,默認值n
    • JPDA_OPTS,默認值為-agentlib:jdwp=transport=$JPDA_TRANSPORT,address=$JPDA_ADDRESS,server=y,suspend=$JPDA_SUSPEND
  • 其它
    • CATALINA_OUT,使用全路徑方式指定stdout和stderr重定向之后的文件名,默認值為$CATALINA_BASE/logs/catalina.out。
    • CATALINA_PID,本選項在*nix下有效,指定pid文件的存儲路徑,默認值為空,如用戶指定,則啟動、停止時都會從變量指定的文件中提取進程ID。
    • LOGGING_CONFIG,定義tomcat使用的日志配置文件的路徑,默認值為$CATALINA_BASE/conf/logging.properties。
    • LOGGING_MANAGER,定義tomcat使用的日志管理器。

看過變量的定義之后,是否有定制變量取值的沖動了?

10.5、如何定義catalina.sh提供的變量?

  • 方法一,修改catalina.sh,在腳本的開始位置為前述變量賦值。
  • 方法二,提供自定義的啟動、停止腳本,在自定義的腳本中為前述變量賦值。
  • 方法三,使用tomcat開發人員預留的擴展方法,在$CATALINA_BASE/bin/setenv.sh中為前述變量賦值。

個人推薦方法二,升級tomcat版本時非常簡單,不需要從原tomcat安裝路徑下復制文件到升級后的tomcat的安裝路徑下。

 

11、調試過程嘗試的命令:
$ gedit dockerd
#!/bin/bash
/tomcat/apache-tomcat-7.0.85/bin/startup.sh
/bin/bash
exit 0

$ docker run -it --name mytomcat -d -p 81:8080 mytomcat:v1 /etc/rc.d/init.d/dockerd
cat /tomcat/apache-tomcat-7.0.85/conf/server.xml
docker container start mytomcat        #啟動項目


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM