docker部署可執(zhí)行jar包的思路與完整步驟
我們構(gòu)建的是運(yùn)行bash文件命令的鏡像,而不是構(gòu)建jar包的鏡像。好處就是,jar包有更新,只需替換jar包或者bash文件,而無須重新構(gòu)建鏡像。
通常,用docker承載運(yùn)行java程序,是將jar包先構(gòu)建鏡像,然后創(chuàng)建docker容器運(yùn)行。如果jar包更新,就需要?jiǎng)h除原鏡像,重新來一遍,耗時(shí)耗力。有一個(gè)方案是,我們創(chuàng)建一個(gè)bash文件(linux的批處理文件),其內(nèi)容是運(yùn)行我們的jar包。然后創(chuàng)建運(yùn)行該bash文件的docker鏡像、docker容器。這樣的好處是很明顯的,jar包有更新,只替換jar包,甚至jar包改名了,也只是更改bash文件的內(nèi)容而已,而鏡像、容器,不會(huì)受到任何影響,無需作出任何改動(dòng)。
一、思路
1、將docker容器中的指定文件夾掛載到宿主機(jī)上,更新jar包只需上傳到宿主機(jī)指定路徑,方便更新
2、利用bash文件運(yùn)行jar包,并構(gòu)建該bash的鏡像,代替構(gòu)建直接運(yùn)行jar包的鏡像,利于鏡像與jar包解耦。
例如,app-1.0.0.jar 升級(jí)到 app-2.0.0.jar,只須更改bash文件的內(nèi)容,而無須構(gòu)建新的鏡像。
二、準(zhǔn)備工作
1、創(chuàng)建存放docker配置文件、jar包的文件夾
在宿主機(jī)上,創(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)建這個(gè)路徑
后面會(huì)將此路徑掛載到當(dāng)前文件夾:/home/admin/app
3、創(chuàng)建容器配置文件
vi Dockerfile
FROM java:8 EXPOSE 8081 ENTRYPOINT ["sh","/usr/data/run.sh"]
8081是我們這個(gè)jar包的對(duì)外端口
最后一句,有網(wǎng)上教程寫的是 CMD [“sh”,“-c”,“/usr/data/hello.sh”],但不知道為什么,我這樣寫的話,容器運(yùn)行后會(huì)提示沒有權(quán)限!
二、構(gòu)建鏡像
仍然在/home/admin/app下,構(gòu)建鏡像。注意最后一個(gè)“.”,表示 Dockerfile 文件在當(dāng)前目錄下。
docker build -t myapp:1.0.0 .
三、創(chuàng)建容器并運(yùn)行
docker run -d -it --name=myapp -p 8081:8081 -v /home/admin/app:/usr/data myapp:1.0.0
docker引擎重啟后自動(dòng)運(yùn)行(也可以理解為操作系統(tǒng)重啟后自動(dòng)運(yùn)行,如果docker是開機(jī)自動(dòng)運(yùn)行的話)
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掛載到宿主機(jī)的/home/admin/app。以后jar包有更新,丟到宿主機(jī)的/home/admin/app,然后重啟容器即可。
-d: 后臺(tái)運(yùn)行容器,并返回容器ID;
-d, --detach=false Run container in background and print container ID
-i: 以交互模式運(yùn)行容器,通常與 -t 同時(shí)使用;
-i, --interactive=false Keep STDIN open even if not attached
-t: 為容器重新分配一個(gè)偽輸入終端,通常與 -i 同時(shí)使用;
-t, --tty=false Allocate a pseudo-TTY
四、刪除多余或失敗的容器、鏡像
以上步驟,可能存在波折,不小心就創(chuàng)建了許多并不稱心如意的容器和鏡像,占用了心水名稱和端口,必先刪之而后快。
1、觀察已經(jīng)有哪些容器
docker ps -a
加上 -a 參數(shù),可以列出沒有在運(yùn)行的容器。
2、刪除指定容器
docker rm $name 或者 容器ID
3、觀察已經(jīng)有哪些鏡像
docker images
4、刪除指定鏡像
docker rmi -f $name 或者 鏡像ID
要?jiǎng)h除鏡像,首先要?jiǎng)h除它派生的容器。
五、docker世界中的一些術(shù)語
我現(xiàn)在是這么理解的:
docker是一個(gè)程序,它不是容器,而是容器引擎。
我們的程序要用docker來跑,首先要?jiǎng)?chuàng)建一個(gè)開啟我們程序的鏡像。
docker利用這個(gè)鏡像,開啟并運(yùn)行容器。
容器是鏡像的實(shí)例,同一個(gè)鏡像可以派生出多個(gè)實(shí)例。
六、補(bǔ)充
如上所述,我的思路是將容器內(nèi)的文件夾掛載到宿主機(jī)的文件夾上,方便以后更新維護(hù)。如果沒有這層考慮,其實(shí)也可以將jar包直接塞到容器里運(yùn)行,不過一旦jar包有更新,需要重新構(gòu)建鏡像和容器。
直接塞到容器里運(yùn)行的方法是Dockerfile內(nèi)容稍有點(diǎn)不同:
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)容請(qǐng)搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。