引言
一個(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}"])
}