Docker(三)| Java項目打包成鏡像並動態加載配置文件和日誌、文件持久化


Docker(三)| Java項目打包成鏡像並動態加載配置文件和日誌、文件持久化


背景:

  • 基於springboot的java項目
  • 使用yml文件配置日誌 或 logback配置日誌文件(日誌不用說,肯定需要持久化的,我們不希望項目報錯然後容器停止了,什麼問題都不知道
  • 連接mysql數據庫(連接上一篇文章.介紹的mysql容器
  • 項目會輸出txt文件(這些文件需要持久化

重點:因爲數據庫地址或者我們請求外部動態變化的容器地址,肯定是需要配置文件去配置的,這樣可以方便修改,不能和項目打包到一起,不然地址一變就需要重新打包,特麻煩


前言: 配置持久化日誌和持久保存txt文件肯定是需要主機和容器共享同一個目錄才行的,上一篇文章.有介紹到用-v參數指定容器的持久化的掛載/共享目錄,可以保證數據不會因爲容器停止而丟失,而且可以共享宿主機上的文件。廢話不多說,直接開擼


  1. 在java項目中指定日誌在主機上的絕對路徑,兩種方式:
  • yml
    在這裏插入圖片描述
  • logback
    在這裏插入圖片描述
  1. 這裏在java項目中指定輸出的txt文件持久化,直接配置宿主機路徑:
    在這裏插入圖片描述

  2. 配置數據庫地址或外部請求地址,這裏我直接寫的本地,到後面修改(後期容器已經運行後需要修改配置文件,下面會說這個問題
    在這裏插入圖片描述

  3. 配置完成將項目打包成可執行jar
    配置好pom文件
    在這裏插入圖片描述
    使用IDEAmaven工具打包

  4. 配置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.

  1. application-dev.yml文件拷貝到上面第5步對應的目錄(/data/java/config)下,下面的第9步會掛載此目錄,方便我們修改這個文件,然後重啓容器即可重新加載該文件

  2. Dockerfile文件和可執行jar包拷貝到linux主機上的同一目錄下

在同一個目錄下使用命令:(注意最後一個".",表示當前目錄

docker build -t java/smart:2019 .
  • -t java/smart:2019:表示構建成java/smart的鏡像名稱,tags2019

如果提示錯誤:“docker build” requires exactly 1 argument.
是因爲少了最後面的那個點 “.”

  1. 查看鏡像java/smart是否已經創建好,命令:
docker images

可以看到鏡像已經存在
在這裏插入圖片描述

  1. 啓動容器,命令:(啓動後會出現一串字符串)
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:容器可以掛載多個目錄,每個目錄功能不一樣

  1. 動態查看java/smart容器日誌
docker logs -f java/smart

不用-f只能查看最後十行的日誌,-f即代表動態查看日誌


重點:動態修改配置文件問題

由於項目需要請求外部的地址,如mysql等,所以項目就算打成jar不能修改了,還是要讓它掃描外部配置文件,這樣方便我們修改,省去了重複打jar包的時間。

上面的第6步已經提到將我們的配置文件放到對應的掛載目錄(/data/java/config)下,對應的容器中運行jar包的命令,加載的也是這個目錄下的文件,所以我們修改宿主機上的文件,再重啓容器即可讓它生效

1.修改/data/java/configapplication-dev.yml文件

2.重啓容器:docker restart smart

這裏的重點是保證宿主機和容器進行目錄掛載,然後jar包的運行命令中加載的是容器中掛載目錄下的文件。

簡單說我們的-v參數後面接的冒號前面的是宿主機的目錄,是我們方便修改的地方,冒號後面的是容器的掛載目錄,程序啓動命令是加載容器中的目錄,而不是宿主機的目錄


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章