首頁 > 軟體

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

2022-07-12 18:00:55

前言

我們構建的是執行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"]

總結

到此這篇關於docker部署可執行jar包的思路與完整步驟的文章就介紹到這了,更多相關docker部署可執行jar包內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com