Doker部署springBoot項(xiàng)目
今天我們分享一個(gè)小知識(shí)點(diǎn)——docker部署springboot項(xiàng)目,之所以說它是個(gè)小知識(shí)點(diǎn),是因?yàn)閮?nèi)容不多,而且也很簡單,內(nèi)容主要包含兩個(gè)方面,一個(gè)是基于docker構(gòu)建springboot項(xiàng)目的鏡像,一個(gè)就是用docker啟動(dòng)我們的springboot項(xiàng)目鏡像。
編寫Dockerfile文件
首先,我們要編寫這樣一份Dockfile,文件名就就是Dockerfile,沒有后綴名,這個(gè)文件在項(xiàng)目的根目錄下,可以先看我的項(xiàng)目結(jié)構(gòu):

然后在Dockerfile中寫入如下內(nèi)容,項(xiàng)目不同,配置有所不同,可根據(jù)自己的需要進(jìn)行修改:
# Docker image for springboot file run
# VERSION 0.0.1
# Author: eangulee
# 基礎(chǔ)鏡像使用java
FROM java:8
# 作者
MAINTAINER syske <[email protected]>
# VOLUME 指定了臨時(shí)文件目錄為/tmp。
# 其效果是在主機(jī) /var/lib/docker 目錄下創(chuàng)建了一個(gè)臨時(shí)文件,并鏈接到容器的/tmp
VOLUME /tmp
# 將jar包添加到容器中并更名為springboot-learning.jar
ADD target/springboot-learning-0.0.1-SNAPSHOT.jar /springboot-learning.jar
# 運(yùn)行jar包
RUN bash -c 'touch /springboot-learning.jar'
ENV TZ 'Asia/Shanghai'
EXPOSE 8089
ENTRYPOINT ["java","-jar","/springboot-learning.jar"]
這里簡單介紹下這個(gè)文件的結(jié)構(gòu)。
FROM的作用是指定項(xiàng)目的運(yùn)行環(huán)境,這里我們指定的是java8;
VOLUME 指定了臨時(shí)文件目錄為/tmp。其效果是在主機(jī) /var/lib/docker目錄下創(chuàng)建了一個(gè)臨時(shí)文件,并鏈接到容器的/tmp。該步驟是可選的,如果涉及到文件系統(tǒng)的應(yīng)用就很有必要了。
/tmp目錄用來持久化到 Docker 數(shù)據(jù)文件夾,因?yàn)?Spring Boot 使用的內(nèi)嵌 Tomcat 容器默認(rèn)使用/tmp作為工作目錄
項(xiàng)目的 jar 文件作為 springboot-learning.jar添加到容器的ENTRYPOINT 執(zhí)行項(xiàng)目 springboot-learning.jar。為了縮短 Tomcat啟動(dòng)時(shí)間,添加一個(gè)系統(tǒng)屬性指向 /dev/./urandom作為 Entropy Source。
ADD就是將我們編譯的jar文件添加到容器中,這里可以知道加入容器的文件名;
RUN bash -c就是運(yùn)行shell命令;
ENV作用是這是環(huán)境變量,這里設(shè)置的是時(shí)區(qū);
EXPOSE的作用是指定容器運(yùn)行端口;
ENTRYPOINT的作用是指定容器運(yùn)行命令,指定之后,容器運(yùn)行的時(shí)候就會(huì)執(zhí)行我們指定的命令;
關(guān)于Dockerfile編寫,可以參考菜鳥教程:
https://www.runoob.com/docker/docker-dockerfile.html
項(xiàng)目打包
在編寫Dockerfile的時(shí)候,我們指定了jar文件的名字,所以在運(yùn)行Dockerfil之前,我們要先打包好項(xiàng)目的jar文件,確保Dockerfile中指定的jar文件已經(jīng)編譯好:

打包完成后,我們就可以制作我們的springboot項(xiàng)目的鏡像了。
制作鏡像
首先確保本地docker已經(jīng)啟動(dòng),然后在項(xiàng)目根目錄,即Dockerfile所在目錄

執(zhí)行如下命令:
docker build -t springboot-learning:v1 .
-t 參數(shù)是指定此鏡像的tag名,一般通常就是項(xiàng)目名:版本號。注意最后面的.,不要忘記了。
如果有如下提示,則表面springboot項(xiàng)目的鏡像構(gòu)建完成,如果你是第一次構(gòu)建,要拉取java8的鏡像,所以時(shí)間可能會(huì)比較長:

然后我們可以通過下面的命令查看本地鏡像:
docker images
其中就有我們剛剛構(gòu)建完成的鏡像:

啟動(dòng)springboot鏡像
啟動(dòng)我們構(gòu)建的鏡像與啟動(dòng)其他鏡像沒有本質(zhì)區(qū)別,只是我們在指定端口的時(shí)候,容器的端口就是我們前面構(gòu)建時(shí)指定的端口:
docker run --rm --name springboot-learning -p 8089:8089 springboot-learning:v1
另外這里的鏡像版本號,也要和構(gòu)建文件保持一致?;剀囍?,你就會(huì)看到熟悉的springboot啟動(dòng)日志信息:

這里我為了方便查看,沒有加-d(后臺(tái)運(yùn)行),所以你ctrl+c后,容器會(huì)自動(dòng)停止,一般我們線上運(yùn)行都是后臺(tái)運(yùn)行的。
測試
我的項(xiàng)目中有測試的controller,我們?yōu)g覽器訪問下看看:


和我們直接在本地java -jar啟動(dòng)一樣,沒有任何區(qū)別。
最后,簡單總結(jié)下,最近一段時(shí)間,我們分享了很多云生態(tài)相關(guān)的知識(shí),包括dokcer、k8s等比較主流的技術(shù),讓包括我在內(nèi)的各位小伙伴對java云生態(tài)有了一些初步的認(rèn)識(shí)和了解。
然后再加上我們今天分享的springboot項(xiàng)目鏡像構(gòu)建,現(xiàn)在這一連串的技術(shù)已經(jīng)差不多全都被我們串起來了,可以這樣說,如果這些知識(shí)你自己都有動(dòng)手做過,都有實(shí)踐過,那你對目前主流的云生態(tài)應(yīng)該已經(jīng)有了最基本的認(rèn)知,至少在使用和應(yīng)用方面沒有太多的問題。后面我們再分享下kuboard的用法,我們的springboot項(xiàng)目就可以運(yùn)行在k8s中了,然后剩下的更細(xì)節(jié)的知識(shí)點(diǎn)就靠各位小伙伴自己去探索學(xué)習(xí)了。好了,今天的內(nèi)容就到這里了。
