Docker(三)| Java項目打包成鏡像並動態加載配置文件和日誌、文件持久化
背景:
- 基於springboot的java項目
- 使用yml文件配置日誌 或 logback配置日誌文件(日誌不用說,肯定需要持久化的,我們不希望項目報錯然後容器停止了,什麼問題都不知道)
- 連接mysql數據庫(連接上一篇文章.介紹的mysql容器)
- 項目會輸出txt文件(這些文件需要持久化)
重點:因爲數據庫地址或者我們請求外部動態變化的容器地址,肯定是需要配置文件去配置的,這樣可以方便修改,不能和項目打包到一起,不然地址一變就需要重新打包,特麻煩
前言: 配置持久化日誌和持久保存txt文件肯定是需要主機和容器共享同一個目錄才行的,上一篇文章.有介紹到用-v
參數指定容器的持久化的掛載/共享目錄
,可以保證數據不會因爲容器停止而丟失,而且可以共享宿主機上的文件。廢話不多說,直接開擼
- 在java項目中指定日誌在主機上的絕對路徑,兩種方式:
- yml
- logback
-
這裏在
java
項目中指定輸出的txt文件持久化,直接配置宿主機路徑:
-
配置數據庫地址或外部請求地址,這裏我直接寫的本地,到後面修改(後期容器已經運行後需要修改配置文件,下面會說這個問題)
-
配置完成將項目打包成可執行
jar
包
配置好pom
文件
使用IDEA
的maven
工具打包 -
配置
Dockerfile
文件
FROM java:8
EXPOSE 8900
#VOLUME /tmp
ADD smart.jar app.jar
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-jar","/app.jar","--spring.config.location=/data/java/config/application-dev.yml"]
- FROM java:8:使用
jdk8
作爲基礎鏡像 - EXPOSE 8900:暴露容器的
8900
端口 - VOLUME /tmp:創建一個容器的掛載目錄。這裏我註釋了,沒有指定,會在後面的運行命令中指定容器的掛載點
- ADD smart.jar app.jar:將複製指定的
smart.jar
爲容器中的app.jar
,相當於拷貝到容器中取了個別名 - RUN bash -c ‘touch /app.jar’: 創建一個新的容器並在新的容器中運行命令
- ENTRYPOINT[]:相當於在容器中用
cmd
命令執行jar
包
大家不懂Ddockerfile的命令可以參考這個,下載書籍:https://blog.csdn.net/qq_25112523/article/details/99192334.
-
將
application-dev.yml
文件拷貝到上面第5步對應的目錄(/data/java/config
)下,下面的第9步會掛載此目錄,方便我們修改這個文件,然後重啓容器即可重新加載該文件 -
將
Dockerfile
文件和可執行jar
包拷貝到linux主機上的同一目錄下
在同一個目錄下使用命令:(注意最後一個".",表示當前目錄)
docker build -t java/smart:2019 .
- -t java/smart:2019:表示構建成
java/smart
的鏡像名稱,tags
爲2019
如果提示錯誤:“docker build” requires exactly 1 argument.
是因爲少了最後面的那個點 “.”
- 查看鏡像
java/smart
是否已經創建好,命令:
docker images
可以看到鏡像已經存在
- 啓動容器,命令:(啓動後會出現一串字符串)
docker run -dit \
--name smart \
-p 8900:8900 \
-v /data/java/server:/data/java/server \
-v /data/java/config:/data/java/config \
-v /data/java/logs:/data/java/logs \
-v /data/java/txt:/data/java/txt \
java/smart:2019
- -dit:同時使用
-d,-i,-t
命令 - –name java/smart:容器別名,我們還是將容器的別名和鏡像名取一樣的
- -p 8900:8900:映射主機和容器之間的端口
- -v /data/java/logs:/data/java/logs:掛載/共享主機上的
/data/java/logs
,方便持久化日誌,後面就算java/smart
容器出錯停止,我們還是可以通過日誌查看問題所在 - java/smart:2019:指定鏡像名稱和版本號
PS:容器可以掛載多個目錄,每個目錄功能不一樣
- 動態查看
java/smart
容器日誌
docker logs -f java/smart
不用
-f
只能查看最後十行的日誌,-f
即代表動態查看日誌
重點:動態修改配置文件問題
由於項目需要請求外部的地址,如mysql等,所以項目就算打成jar不能修改了,還是要讓它掃描外部配置文件,這樣方便我們修改,省去了重複打jar包的時間。
上面的第6步已經提到將我們的配置文件放到對應的掛載目錄(/data/java/config
)下,對應的容器中運行jar包的命令,加載的也是這個目錄下的文件,所以我們修改宿主機上的文件,再重啓容器即可讓它生效
1.修改/data/java/config
的application-dev.yml
文件
2.重啓容器:docker restart smart
這裏的重點是保證宿主機和容器進行目錄掛載,然後jar
包的運行命令中加載的是容器中掛載目錄下的文件。
簡單說我們的-v參數後面接的冒號前面的是宿主機的目錄,是我們方便修改的地方,冒號後面的是容器的掛載目錄,程序啓動命令是加載容器中的目錄,而不是宿主機的目錄