Deploying JavaWeb Application on Docker Tomcat Service
在擁有了一台 Linux 主機後,想利用 Docker 建個 Tomcat Service 並且利用 war 檔案執行 JavaWeb Application,要怎麼做呢?
下載 Tomcat Image
輸入下列指令進行下載 Tomcat Image
docker pull tomcat
啟動 Tomcat Contianer
先輸入下列指令查看下載後的 Image
docker images
接著利用下列指令啟動 Tomcat Contianer
docker run -p 8080:8080 tomcat:latest
最後輸入下列指令,看看是不是已經正常啟動了呢?
docker ps
執行 Spring Boot Application with Tomcat
現在有了一個在 Docker 上運行中的 Tomcat 了,把 Spring Boot Application 打包成 war 檔放進 Tomcat 中吧!
HTTP Status 404 — Not found
Type Status Report
Description The origin server did not find a current representation for the target resource or is not willing to disclose that one exists.
嗯……怎麼可能會有問題,在本機使用 IDE 執行的時候都好好的,為什麼會出錯呢?
原來,在 docker hub 中已有說明,預設的 webapps 未啟動,需使用 webapps.dist
Note: as of docker-library/tomcat#181, the upstream-provided (example) webapps are not enabled by default, per upstream’s security recommendations, but are still available under the
webapps.dist
folder within the image to make them easier to re-enable.
作法:將 webapps 改其它的名稱,並且把 webapps.dist 改名為 webapps
mv webapps webapps.bak
mv webappsdist webapps
好,再來試試看,把 war 檔重新置入 webapps 中!
執行吧! Spring Boot!就決定是你了~~
HTTP Status 404 — Not found
呃…還是一樣沒辦法動啊……….又給我 404 Not Found….
原來,Application 需要繼承 SpringBootServletInitializer 並且覆寫 configure method ,匯出的 war 檔才能正常運作,改寫方式可參考下列程式碼:
@SpringBootApplication
public class StartWebApplication extends SpringBootServletInitializer {public static void main(String[] args) {
SpringApplication.run(StartWebApplication.class, args);
}@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(StartWebApplication.class);
}
}
終於,可以正常運作了,打完收工!
其它方式
如果想利用 Dockerfile 的方式進行發佈,可以參考下列說明喔!