Deploying Spring boot War Application on Docker
以往寫 Java Web 時,要將打包後的 war 檔放到某台主機上的 Tomcat/JBoss 中運作,那麼如果使用 Docker,要如何將 Spring boot 打包成 war 檔,並且在 Docker 上運行呢?
建立 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"]
建立 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 運行,可以參考下列說明喔!