網站首頁 編程語言 正文
前言
我們構建的是運行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
- 上一篇:C語言中反斜杠的作用及說明_C 語言
- 下一篇:Go語言中的函數詳解_Golang
相關推薦
- 2022-05-13 CLion 中文輸出亂碼
- 2022-10-28 Python入門之列表用法詳解_python
- 2022-06-17 C#關鍵字in、out、ref的作用與區別_C#教程
- 2023-07-05 uni-app處理請求發送表單類型的數據
- 2022-09-17 docker安裝postgresql的圖文教程_docker
- 2022-10-04 goland?-sync/atomic原子操作小結_Golang
- 2023-03-27 python中的正則表達式,貪婪匹配與非貪婪匹配方式_python
- 2022-07-10 css選擇器優先級問題
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支