docker部署可執(zhí)行jar包的思路與完整步驟
前言
我們構(gòu)建的是運行bash文件命令的鏡像,而不是構(gòu)建jar包的鏡像。好處就是,jar包有更新,只需替換jar包或者bash文件,而無須重新構(gòu)建鏡像。
通常,用docker承載運行java程序,是將jar包先構(gòu)建鏡像,然后創(chuàng)建docker容器運行。如果jar包更新,就需要刪除原鏡像,重新來一遍,耗時耗力。有一個方案是,我們創(chuàng)建一個bash文件(linux的批處理文件),其內(nèi)容是運行我們的jar包。然后創(chuàng)建運行該bash文件的docker鏡像、docker容器。這樣的好處是很明顯的,jar包有更新,只替換jar包,甚至jar包改名了,也只是更改bash文件的內(nèi)容而已,而鏡像、容器,不會受到任何影響,無需作出任何改動。
一、思路
1、將docker容器中的指定文件夾掛載到宿主機上,更新jar包只需上傳到宿主機指定路徑,方便更新
2、利用bash文件運行jar包,并構(gòu)建該bash的鏡像,代替構(gòu)建直接運行jar包的鏡像,利于鏡像與jar包解耦。
例如,app-1.0.0.jar 升級到 app-2.0.0.jar,只須更改bash文件的內(nèi)容,而無須構(gòu)建新的鏡像。
二、準備工作
1、創(chuàng)建存放docker配置文件、jar包的文件夾
在宿主機上,創(chuàng)建文件夾:/home/admin/app,用于存放bash文件和jar包。然后在該文件夾下,創(chuàng)建bash文件和容器配置文件
2、創(chuàng)建bash文件
vi run.sh
java -jar /usr/data/app-1.0.0.jar
/usr/data是docker容器內(nèi)的路徑
我們不必真的到容器內(nèi)創(chuàng)建這個路徑
后面會將此路徑掛載到當前文件夾:/home/admin/app
3、創(chuàng)建容器配置文件
vi Dockerfile
FROM java:8 EXPOSE 8081 ENTRYPOINT ["sh","/usr/data/run.sh"]
8081是我們這個jar包的對外端口
最后一句,有網(wǎng)上教程寫的是 CMD [“sh”,“-c”,“/usr/data/hello.sh”],但不知道為什么,我這樣寫的話,容器運行后會提示沒有權(quán)限!
二、構(gòu)建鏡像
仍然在/home/admin/app下,構(gòu)建鏡像。注意最后一個“.”,表示 Dockerfile 文件在當前目錄下。
docker build -t myapp:1.0.0 .
三、創(chuàng)建容器并運行
docker run -d -it --name=myapp -p 8081:8081 -v /home/admin/app:/usr/data myapp:1.0.0
docker引擎重啟后自動運行(也可以理解為操作系統(tǒng)重啟后自動運行,如果docker是開機自動運行的話)
docker run --restart=always -d -it --name=myapp -p 8082:8081 -v /home/admin/app:/usr/data myapp:1.0.0
-v,將容器內(nèi)的/usr/data掛載到宿主機的/home/admin/app。以后jar包有更新,丟到宿主機的/home/admin/app,然后重啟容器即可。
-d: 后臺運行容器,并返回容器ID;
-d, --detach=false Run container in background and print container ID
-i: 以交互模式運行容器,通常與 -t 同時使用;
-i, --interactive=false Keep STDIN open even if not attached
-t: 為容器重新分配一個偽輸入終端,通常與 -i 同時使用;
-t, --tty=false Allocate a pseudo-TTY
四、刪除多余或失敗的容器、鏡像
以上步驟,可能存在波折,不小心就創(chuàng)建了許多并不稱心如意的容器和鏡像,占用了心水名稱和端口,必先刪之而后快。
1、觀察已經(jīng)有哪些容器
docker ps -a
加上 -a 參數(shù),可以列出沒有在運行的容器。
2、刪除指定容器
docker rm $name 或者 容器ID
3、觀察已經(jīng)有哪些鏡像
docker images
4、刪除指定鏡像
docker rmi -f $name 或者 鏡像ID
要刪除鏡像,首先要刪除它派生的容器。
五、docker世界中的一些術(shù)語
我現(xiàn)在是這么理解的:
docker是一個程序,它不是容器,而是容器引擎。
我們的程序要用docker來跑,首先要創(chuàng)建一個開啟我們程序的鏡像。
docker利用這個鏡像,開啟并運行容器。
容器是鏡像的實例,同一個鏡像可以派生出多個實例。
六、補充
如上所述,我的思路是將容器內(nèi)的文件夾掛載到宿主機的文件夾上,方便以后更新維護。如果沒有這層考慮,其實也可以將jar包直接塞到容器里運行,不過一旦jar包有更新,需要重新構(gòu)建鏡像和容器。
直接塞到容器里運行的方法是Dockerfile內(nèi)容稍有點不同:
FROM java:8 MAINTAINER chenqu ADD demo-0.0.1-SNAPSHOT.jar demo.jar EXPOSE 8080 ENTRYPOINT ["java","-jar","demo.jar"]
總結(jié)
到此這篇關(guān)于docker部署可執(zhí)行jar包的思路與完整步驟的文章就介紹到這了,更多相關(guān)docker部署可執(zhí)行jar包內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Docker中鏡像構(gòu)建文件Dockerfile與相關(guān)命令的詳細介紹
這篇文章主要介紹了Docker中鏡像構(gòu)建文件Dockerfile與相關(guān)命令的相關(guān)資料,文中介紹的很詳細,相信對大家具有一定的參考價值,有需要的朋友們下面來一起看看吧。2017-02-02Docker?創(chuàng)建centos容器集群并實現(xiàn)遠程登錄功能
這篇文章主要介紹了Docker?創(chuàng)建centos容器集群并實現(xiàn)遠程登錄,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-03-03dockerfile echo指定文件多行文本的方法實現(xiàn)
這篇文章主要介紹了dockerfile echo指定文件多行文本的方法實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-09-09淺談關(guān)于Docker容器互聯(lián)的初步實踐
這篇文章主要介紹了淺談關(guān)于Docker容器互聯(lián)的初步實踐,本文介紹了使用網(wǎng)橋(bridge)來對容器進行互聯(lián),非常具有實用價值,需要的朋友可以參考下2018-10-10Docker tomcat的設(shè)置內(nèi)存大小配置方式
這篇文章主要介紹了Docker tomcat的設(shè)置內(nèi)存大小配置方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03關(guān)于Docker 刪除dead狀態(tài)的容器問題及解決方案
這篇文章主要介紹了Docker 刪除dead狀態(tài)的容器,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-05-05