這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
1,tomcat
使用alpine環境自己打包安裝一個tomcat環境。
使用的是openjdk的jre,目標就是系統盡量的小。
依賴的東西盡量的少。構建tomcat最少需要一個jre。
使用的openjdk8的jre,才106mb。已經非常的小了。
http://blog.csdn.net/freewebsys/article/details/53744348
下載tomcat:
http://tomcat.apache.org/download-80.cgi
tomcat最新的版本是8.5.9 ,tomcat9 還在測試中,生產環境使用tomcat8就行了,效能足夠了。
2,整理下tomcat
tar -zxvf apache-tomcat-8.5.9.tar.gz mv apache-tomcat-8.5.9 tomcatcd tomcatrm -rf LICENSE NOTICE RELEASE-NOTES RUNNING.txt webapps/* bin/* conf/tomcat-users*
首先解壓縮,然後把tomcat裡面的亂七八糟的東西刪除下。
什麼ROOT,Manager,user啥的,防止別人獲得系統管理權限。
然後修改下service.xml,設定ROOT是 / 訪問。
<?xml version="1.0" encoding="UTF-8"?><Server port="8005" shutdown="SHUTDOWN"> <Listener className="org.apache.catalina.startup.VersionLoggerListener"/> <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/> <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener"/> <GlobalNamingResources/> <Service name="Catalina"> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"/> <Engine name="Catalina" defaultHost="localhost"> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Context docBase="ROOT" path="/"/> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="access_log" suffix=".txt" pattern="%h %l %T %t %r %s %b %{Referer}i %{User-Agent}i"/> </Host> </Engine> </Service></Server>
其中刪除了JreMemoryLeakPreventionListener,關閉了tomcat的一個小時一次的full gc操作。
正常系統上線,記憶體一般都設定的很大不用擔心這個。
http://gao-xianglong.iteye.com/blog/2171441
3,打包tomcat
vi Dockerfile
# AlpineLinux open jre 8 & tomcatFROM demo/openjre8-base:1.0# add tomcatRUN mkdir -p /optCOPY tomcat /opt/tomcat# Set environmentENV TOMCAT_HOME /opt/tomcatENV PATH ${PATH}:${TOMCAT_HOME}/binENTRYPOINT ["/opt/tomcat/bin/catalina.sh", "run"]
注意這裡依賴openjre8 的鏡像,要提前打好。
構建:
docker build -t demo/tomcat-base:1.0 .
這樣打包的tomcat 只有 114.8 MB 。非常的小呢。
4,測試啟動
建立檔案夾:
mkdir -p /data/tomcat/ROOT/WEB-INFecho "ok" > /data/tomcat/ROOT/indexvi /data/tomcat/ROOT/WEB-INF/web.xml
寫一個web.xml 配置
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1" metadata-complete="true"></web-app>
建立臨時檔案夾,log檔案夾,temp檔案夾,並設定許可權。
在做tomcat基礎包的時候,把ROOT檔案夾空出來,以後的應用要使用的時候再加上。
mkdir -p /data/tomcat/logsmkdir -p /data/tomcat/tempchcon -Rt svirt_sandbox_file_t /data/tomcat/logschcon -Rt svirt_sandbox_file_t /data/tomcat/temp
啟動tomcat:
docker run -d -p 8080:8080 -v /data/tomcat/ROOT:/opt/tomcat/webapps/ROOT \ -v /data/tomcat/logs:/opt/tomcat/logs -v /data/tomcat/temp:/opt/tomcat/temp \ --name tomcat-test demo/tomcat-base:1.0
啟動tomcat並綁定連接埠8080,映射目錄/data/tomcat/ROOT 作為主目錄,同時映射logs和temp檔案夾。
這樣直接可以看tomcat的日誌了。
#curl localhost:8080/indexok
測試下能訪問成功。
進入docker容器查看:
docker exec -it tomcat-test bash
bash-4.3# df
4,總結
本文的原文串連是: http://blog.csdn.net/freewebsys/article/details/53761840 未經博主允許不得轉載。
博主地址是:http://blog.csdn.net/freewebsys
特別注意一點。有的是docker啟動的時候並沒有帶動tomcat啟動,而是直接退出了。
這個並不是docker的問題。是因為使用的命令不對。要使用 catalina.sh run 這個參數,這個命令一直執行。
如果使用startup.sh的時候就上後台了。docker以為有問題了。shell執行完了,就直接退出了。然後就不能-d執行了。
也就是說,使用entrypoint 和cmd 命令必須是一個死迴圈一直執行的命令。
entrypoin和cmd的區別就是cmd可以被替換。
要是使用 docker run -it demo/tomcat-base bash這個命令執行兩個不同包。
entrypoint的包tomcat會啟動,而cmd打的包,tomcat被shell替換了。不啟動。