Deploying JavaWeb Application on Docker Tomcat Service

擁有了一台 Linux 主機後,想利用 Docker 建個 Tomcat Service 並且利用 war 檔案執行 JavaWeb Application,要怎麼做呢?

邦哥不會寫程式
程式裡有蟲
Nov 15, 2020

--

Photo by Maximilian Weisbecker on Unsplash

下載 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 的方式進行發佈,可以參考下列說明喔!

參考資料

--

--

程式裡有蟲
程式裡有蟲

Published in 程式裡有蟲

工程師的日常,用程式解決生活大小事

邦哥不會寫程式
邦哥不會寫程式

Written by 邦哥不會寫程式

無意間成為了全端開發,以敲鍵盤為生。

No responses yet