Deploying Spring boot War Application on Docker

以往寫 Java Web 時,要將打包後的 war 檔放到某台主機上的 Tomcat/JBoss 中運作,那麼如果使用 Docker,要如何將 Spring boot 打包成 war 檔,並且在 Docker 上運行呢?

邦哥不會寫程式
程式裡有蟲
Nov 18, 2019

--

建立 Project

利用 Spring Initializr 建立一個 Package 為 war 的專案

下載後,使用 IntelliJ IDEA 開啟。

build.gradle 設定

開啟 build.gradle 在最上方加入下列程式碼

buildscript {
dependencies {
classpath('se.transmode.gradle:gradle-docker:1.2')
}
}

在最下方加入下列程式碼

apply plugin: 'docker'
task buildDocker(type: Docker, dependsOn: build) {
push = false
applicationName = 'dome.docker'
dockerfile = file('src/main/docker/Dockerfile')
doFirst {
copy {
from "build/libs/${project.getName()}-${version}.war"
into 'build/docker'
}
}
}

建置專案

切換至 Terminal 視窗,輸入下列指令進行建置

 ./gradlew build

建置完成後,可以在 build/libs 目錄看到產生後的 war 檔

建立 Dockerfile 檔案

還記得剛剛在 build.gradle 加入的 task 嗎?當中有設定了 Dockerfile 的路徑,可以依喜好做調整,並在該路徑下新增一個檔案,命名為 Dockerfile,內容填寫如下:

FROM tomcat:8.5.47-jdk8-openjdk
MAINTAINER JamesBang
# copy war file into container image under app directory
COPY demo.docker-0.0.1.war webapps/demo.war
# expose server port accept connections
RUN sed -i 's/port="8080"/port="9000"/' /usr/local/tomcat/conf/server.xml
EXPOSE 9000
# start application
CMD ["catalina.sh","run"]
Dockerfile 路徑
Dockerfile 內容

建立 Docker Image

切換至 Terminal 視窗,執行下列指令

./gradlew buildDocker

建置成功後,將 image 名稱記下來,待會使用 Docker 執行時會用到。

Docker 執行 Image

剛剛建立的 image 名稱為 com.jameabang/demo.docker:0.0.1,接著利用下列指令將 image 啟動。

docker run -p 9000:9000 -t <tag>

開啟瀏覽器輸入 localhost:9000/demo 就可以看到成果啦!

複製 war 檔至 Docker Container

往後產出 war 檔之後,只要將檔案複製到 Docker Container 的 Tomcat 目錄即可,可參考下列指令:

docker cp demo.war <CONTAINER_ID>:/usr/local/tomcat/webapps

其它方式

如果想利用打包成 war 的方式利用 Tomcat 運行,可以參考下列說明喔!

參考來源

--

--