docker打包jar包,部署簡單web程序的完整流程


自己有一個簡單的springboot web后端項目,每次部署的時候都是上傳到服務器,然后nohup java -jar 運行打包的jar包。這樣每次運行都要輸命令,關閉時還得找到進程id手動kill掉,覺得太煩了,干脆做成docker鏡像。

項目有對宿主機文件系統、數據庫的訪問,但這里不打算把mysql數據庫也打包了,就只是訪問主機上已經運行的。

編寫Dockerfile

首先將需要的文件放在一個文件夾下。這里就只需要一個項目的jar包就行了,但如果想把其他用到的軟件也打包進鏡像,最好也要放進來。

在文件夾下創建Dockerfile文件,開始編寫docker容器構建腳本。

FROM openjdk:15    
MAINTAINER lpjworkroom
ADD test.jar app.jar
EXPOSE 8080
VOLUME /file #聲明這是匿名卷,docker run時-v將主機目錄綁定到此匿名卷
ENTRYPOINT java -jar app.jar

FROM openjdk:15,表示本鏡像的基礎鏡像是openjdk,版本是15,畢竟要用java命令運行jar包的。docker會從dockerhub拉取對應的鏡像,服務器不需要有。

MAINTAINER lpjworkroom,表示鏡像的編寫者。

ADD test.jar app.jar,表示將test.jar,也就是項目jar包,拷貝進鏡像,並命名為app.jar。如果不拷貝,鏡像就沒jar包可運行了。

EXPOSE 8080,表示鏡像將對外暴露8080端口,也就是編寫項目時的運行端口。

VOLUME /file,表示將鏡像的/file文件夾聲明為匿名卷。這樣做是因為,項目會讀寫文件系統的/file文件夾,如果不聲明,那么項目運行后只會對鏡像內的虛擬目錄/file讀寫,而不會對主機的目錄讀寫,等關閉容器后,寫的內容就沒了。所以,聲明匿名卷是為了將寫操作持久化。僅僅在dockerfile里聲明還不夠,在運行容器時還需要設置匿名卷對應的主機目錄,這點我們下面會談到。

ENTRYPOINT java -jar app.jar,表示容器運行后執行的命令。這里就只需要運行jar包就行了。

構建鏡像

編寫了Dockerfile,就可以構建鏡像了。

docker build -t test_app:0.1 .

test_app是鏡像的名字,-t代表給鏡像打的標簽,后面的:0.1意思就是這個鏡像版本是0.1。如果不打標簽,鏡像的標簽會自動設為latest。

最后的一個'.'代表Dockerfile所在位置,因為就在當前目錄下,所以直接是一個'.'就行了。

docker會自動拉取openjdk。一會出現“Successfully built 7717b14bfe0a”,說明構建成功。

運行容器

接下來運行容器。

docker run -d --name test_app -v /home/file:/file --net=host -p 8080:8080 test_app:0.1

-d指在后台運行。

--name為容器起名。

-v指定容器匿名卷掛載的目錄。這里/home/file:/file代表將主機的/home/file對應到容器的/file,也就是說,容器對/file目錄的讀寫也就是對主機的/home/file讀寫。

--net=host指定容器的網絡模式。host是最簡單的模式,容器和主機共用一個網絡,會互相占用端口。由於項目簡單,我就沒有再研究其他模式了,想研究的話可以看看官網教程。

-p 8080:8080指定端口映射。這里簡單的將主機的8080端口映射到容器的8080端口。如果想要多個web程序運行在同一主機,不需要改代碼里的運行端口,直接將主機的不同端口映射到容器的8080即可。

最后是容器使用的鏡像,也就是剛剛構建好的test_app:0.1。

就這樣,容器成功運行了。只要docker start/stop就能控制程序運行,部署新版本時,也只要將jar包再上傳到目錄下,重新構建即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM