日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

docker部署可執行jar包的思路與完整步驟_docker

作者:左直拳 ? 更新時間: 2022-09-04 編程語言

前言

我們構建的是運行bash文件命令的鏡像,而不是構建jar包的鏡像。好處就是,jar包有更新,只需替換jar包或者bash文件,而無須重新構建鏡像。

通常,用docker承載運行java程序,是將jar包先構建鏡像,然后創建docker容器運行。如果jar包更新,就需要刪除原鏡像,重新來一遍,耗時耗力。有一個方案是,我們創建一個bash文件(linux的批處理文件),其內容是運行我們的jar包。然后創建運行該bash文件的docker鏡像、docker容器。這樣的好處是很明顯的,jar包有更新,只替換jar包,甚至jar包改名了,也只是更改bash文件的內容而已,而鏡像、容器,不會受到任何影響,無需作出任何改動。

一、思路

1、將docker容器中的指定文件夾掛載到宿主機上,更新jar包只需上傳到宿主機指定路徑,方便更新

2、利用bash文件運行jar包,并構建該bash的鏡像,代替構建直接運行jar包的鏡像,利于鏡像與jar包解耦。
例如,app-1.0.0.jar 升級到 app-2.0.0.jar,只須更改bash文件的內容,而無須構建新的鏡像。

二、準備工作

1、創建存放docker配置文件、jar包的文件夾

在宿主機上,創建文件夾:/home/admin/app,用于存放bash文件和jar包。然后在該文件夾下,創建bash文件和容器配置文件

2、創建bash文件

vi run.sh
java -jar /usr/data/app-1.0.0.jar

/usr/data是docker容器內的路徑

我們不必真的到容器內創建這個路徑

后面會將此路徑掛載到當前文件夾:/home/admin/app

3、創建容器配置文件

vi Dockerfile
FROM java:8
EXPOSE 8081
ENTRYPOINT ["sh","/usr/data/run.sh"]

8081是我們這個jar包的對外端口

最后一句,有網上教程寫的是 CMD [“sh”,“-c”,“/usr/data/hello.sh”],但不知道為什么,我這樣寫的話,容器運行后會提示沒有權限!

二、構建鏡像

仍然在/home/admin/app下,構建鏡像。注意最后一個“.”,表示 Dockerfile 文件在當前目錄下。

docker build -t myapp:1.0.0 .

三、創建容器并運行

docker run -d -it --name=myapp -p 8081:8081 -v /home/admin/app:/usr/data myapp:1.0.0

docker引擎重啟后自動運行(也可以理解為操作系統重啟后自動運行,如果docker是開機自動運行的話)

docker run --restart=always -d -it --name=myapp -p 8082:8081 -v /home/admin/app:/usr/data myapp:1.0.0

-v,將容器內的/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

四、刪除多余或失敗的容器、鏡像

以上步驟,可能存在波折,不小心就創建了許多并不稱心如意的容器和鏡像,占用了心水名稱和端口,必先刪之而后快。

1、觀察已經有哪些容器

docker ps -a

加上 -a 參數,可以列出沒有在運行的容器。

2、刪除指定容器

docker rm $name 或者 容器ID

3、觀察已經有哪些鏡像

docker images

4、刪除指定鏡像

docker rmi -f $name 或者 鏡像ID

要刪除鏡像,首先要刪除它派生的容器。

五、docker世界中的一些術語

我現在是這么理解的:

docker是一個程序,它不是容器,而是容器引擎。

我們的程序要用docker來跑,首先要創建一個開啟我們程序的鏡像。

docker利用這個鏡像,開啟并運行容器。

容器是鏡像的實例,同一個鏡像可以派生出多個實例。

六、補充

如上所述,我的思路是將容器內的文件夾掛載到宿主機的文件夾上,方便以后更新維護。如果沒有這層考慮,其實也可以將jar包直接塞到容器里運行,不過一旦jar包有更新,需要重新構建鏡像和容器。

直接塞到容器里運行的方法是Dockerfile內容稍有點不同:

FROM java:8
MAINTAINER chenqu
ADD demo-0.0.1-SNAPSHOT.jar demo.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","demo.jar"]

總結

原文鏈接:https://blog.csdn.net/leftfist/article/details/123510744

欄目分類
最近更新