使用 Docker 發(fā)布 Spring Boot 應(yīng)用

引言

一個(gè) Spring Boot 應(yīng)用在編寫(xiě)完成后,可以方便的打包成一個(gè) jar 文件直接運(yùn)行。通常的做法是使用 nohup java -jar app.jar & 的方式使其在服務(wù)器后臺(tái)運(yùn)行。 這種方式對(duì)服務(wù)器環(huán)境不僅有著很強(qiáng)的依賴并且會(huì)產(chǎn)生一個(gè)隨時(shí)間推移越來(lái)越大的 nohup 文件 ,雖然可以利用管道黑洞將其輸出到未知領(lǐng)域,但是對(duì)于運(yùn)行版本的管理仍然依賴于人肉備份的方式。

借助 Docker 不僅可以做到運(yùn)行環(huán)境與服務(wù)器環(huán)境的隔離,同時(shí)可以方便的管理發(fā)布版本。通過(guò)版本 tag 不僅可以方便的回滾到相應(yīng)版本,使用端口映射也可以方便的配合藍(lán)綠發(fā)布。

版本

  • Spring Boot: 2.0.5 Release
  • Docker:
  • Centos: 7.3

步驟

1.編寫(xiě)腳本

# 基于哪個(gè)鏡像
FROM daocloud.io/java:8
# 作者
MAINTAINER PKAQ #pkaq@msn.com
# 在宿主機(jī)的/var/lib/docker目錄下創(chuàng)建一個(gè)臨時(shí)文件并把它鏈接到容器中的/tmp目錄。
VOLUME /tmp
# 將打包好的spring程序拷貝到容器中的指定位置
COPY ./build/lib/app.jar /opt/app.jar
#容器對(duì)外暴露9006
EXPOSE 9006
# 容器啟動(dòng)后執(zhí)行的命令
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/opt/app.jar"]

2.構(gòu)建鏡像

Dockerfile 所在目錄,使用 docker build -t MyApp:1.0 . 這句話的意思是從當(dāng)前目錄的 Dockerfile 文件構(gòu)建一個(gè)名為 MyApp ,版本為 1.0 的鏡像。

3.運(yùn)行容器

使用 docker run -d -e "SPRING_PROFILES_ACTIVE=dev" -p 9006:9006 --name Myapp1.0 Myapp:1.0

上面操作的意思是

  • -d : 以守護(hù)進(jìn)程運(yùn)行一個(gè)容器

  • -e : 為容器傳遞一個(gè)環(huán)境變量

  • -p:映射容器端口 9006 到宿主機(jī)的 9006

  • --name:指定容器的別名

下面是針對(duì)容器操作的幾個(gè)常用命令:

  • 啟動(dòng)容器:docker start Myapp1.0

  • 停止容器:docker stop Myapp1.0

  • 刪除容器:docker rm Myapp1.0

4.應(yīng)用升級(jí)

要升級(jí)應(yīng)用版本時(shí),需要重復(fù)步驟 2-3 構(gòu)建新的 Dockerfile 鏡像。需要注意的是不要忘記修改構(gòu)建時(shí)的版本號(hào),此時(shí)可以通過(guò) -p 參數(shù)在與上一個(gè)版本不同的端口上啟動(dòng)一個(gè)新的容器。配合 LB 工具(如 nginx)切換到新的容器上實(shí)現(xiàn)藍(lán)綠部署。

如果發(fā)布出現(xiàn)問(wèn)題,如果應(yīng)用了藍(lán)綠部署只需要切換回原來(lái)運(yùn)行端口即可。若未使用藍(lán)綠部署的方式,那么也只需要 stop 有問(wèn)題的版本,重新 start 即可。

5.使用 Gradle 插件

如果你是用 Gradle 來(lái)進(jìn)行應(yīng)用構(gòu)建的,那么可以使用 Gradle-Docker 插件進(jìn)行鏡像創(chuàng)建操作。

1.引入插件

plugins {
  id "com.palantir.docker" version "0.20.1"
}

2.編寫(xiě) Dockerfile

# 基于哪個(gè)鏡像
FROM daocloud.io/java:8
# 作者
MAINTAINER PKAQ #pkaq@msn.com
# 在宿主機(jī)的/var/lib/docker目錄下創(chuàng)建一個(gè)臨時(shí)文件并把它鏈接到容器中的/tmp目錄。
VOLUME /tmp
#將打包好的spring程序拷貝到容器中的指定位置
ARG JAR_FILE
COPY ${JAR_FILE} /opt/app.jar
#容器對(duì)外暴露9006
EXPOSE 9006
# 容器啟動(dòng)后執(zhí)行的命令
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/opt/app.jar"]

3.應(yīng)用插件


docker {
    dependsOn build
    name "${project.group}/${bootJar.baseName}"
    files bootJar.archivePath
    buildArgs(['JAR_FILE': "${bootJar.archiveName}"])
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容