使用Docker運行Java Web應用
來自: http://yq.aliyun.com/articles/6894
前言
Tomcat是目前比較流行的Web應用服務器,深受Java愛好者的喜愛。通常J2EE應用的產出物是一個war包,這篇文章將為你介紹如何使用Docker運行Tomcat+war包的Java Web應用,并比較其它幾種方法的優缺點。
在生產環境中,我們推薦基于Tomcat的Docker容器來打包、運行您的Java應用,即在Tomcat的Docker鏡像基礎上構建應用鏡像,Dockerfile如下所示:
FROM tomcat:8
ADD your_app.war /usr/local/tomcat/webapps/
CMD ["catalina.sh", "run"]
Hello-World
Maven是一款優秀的跨平臺項目管理工具,本文將使用Maven構建一個簡單Hello World Web應用,并使用docker來運行。
首先,你需要一個Maven開發環境,你可以在自己的開發環境安裝Maven,或者可以使用Docker Hub上的 Maven鏡像 作為構建環境。
</div>創建一個Maven WebApp
創建maven-demo和maven-repo目錄用作docker volume,這樣Maven創建的項目會持久化在maven-demo目錄下,maven的local repository持久話在maven-repo目錄下。
$ mkdir maven-demo maven-repo
運行maven docker新建一個Maven項目
$ docker run -it --rm --name maven-demo -v "$PWD"/maven-demo:/usr/src/maven-demo -v "$PWD"/maven-repo/:/root/.m2/repository -w /usr/src/maven-demo maven:3 mvn -B archetype:generate -DgroupId=com.aliyun.demo -DartifactId=hello-world -DarchetypeArtifactId=maven-archetype-webapp
運行成功后,可以看到項目目錄結構如下:
hello-world
|---pom.xml
|---src
|---main
|---resource
|---webapp
|---WEB-INF
| |---web.xml
|---index.jsp
構建Maven項目
$ docker run -it --rm --name maven-demo -v "$PWD"/maven-demo/:/usr/src/maven-demo -v "$PWD"/maven-repo/:/root/.m2/repository -w /usr/src/maven-demo/hello-world maven mvn package
構建成功后,hello-world目錄下多了一個target目錄,包含hello-world.war文件。
Docker鏡像打包
編輯Dockerfile
FROM tomcat:8
ADD maven-demo/hello-world/target/hello-world.war /usr/local/tomcat/webapps/
CMD ["catalina.sh", "run"]
Build Image
$ docker build -t maven-demo-hello-world .
運行Docker鏡像
$ docker run -d -p 8080:8080 maven-demo-hello-world
打開瀏覽器訪問 http://127.0.0.1:8080/hello-world/ 將會看到 Hello World! 的輸出,這表示我們編譯的hello-world war 包已經成功使用 Docker 運行起來了。
版本管理
實際生產中需要特別關注的是應用鏡像的版本管理,因為除了你的應用代碼會更新之外,Tomcat的鏡像也會因一些補丁發生版本更新。你需要及時構建應用鏡像的新版本,并打上合適的tag,以便于在升級運行應用時選擇合適的版本。
Docker Hub支持用戶Github倉庫的**自動構建**功能,使得這件事情變得簡單很多。也就是說:只要你的Java應用代碼的Github倉庫中有代碼更新時,會自動更新產生一個新的應用鏡像。 如果你使用阿里云的容器Hub服務,同樣可以支持這樣的功能幫助你構建應用鏡像。
更多實踐方案
由于Docker功能的強大與靈活,也有用戶在實踐中使用其它一些方法,期望獲得同樣的效果,但有一些問題需要特別注意。
使用Data Volume
$ docker run -d -v /tmp/apps/your.war:/usr/local/tomcat/webapps/your.war tomcat:8
這種方法可以避免每次修改代碼都會生成新的Docker應用鏡像的工作,用戶可以將應用包掛載到Tomcat容器的volume中。這個方法非常適合在單機上進行開發測試時使用,當你想更新應用war包時,只需要直接更新即可,無需其它額外工作。但這個做法在生產環境上有明顯的缺陷,因為生產環境中難免會遇到因為各種原因導致容器出錯的情況,在這種情況發生時容器的調度系統可能會把容器調度到另一臺物理機上運行,而那臺機器上卻沒有對應的應用包volume,用戶的應用就無法正常運行了。
數據容器
FROM tomcat:8
ADD your.war /usr/local/tomcat/webapps/
使用這樣的Dockerfile構建出數據容器,并將它的volume與Tomcat容器共享。
$ docker build -t app-image .
$ docker create -d -v /usr/local/tomcat/webapps/ --name app app-image true
$ docker run -d --volumes-from app tomcat:8
由于系統一定會把共享volume的容器調度運行在同一臺宿主機上,這樣可以保證正確運行。然而,由于共享volume的容器只能被調度到同一臺宿主機上,這樣會限制系統的可伸縮性。
聲明:云棲社區站內文章,未經作者本人允許或特別聲明,嚴禁轉載,但歡迎分享。
</div> </code></code></code></code></code></code></code></code></code></code></code>