為什么要使用Dockerfile 構建一個包含多個SpringBoot應用程序的鏡像呢?
1、可移植性:Dockerfile 定義了一個標準化的方式來構建Docker鏡像,意味著無論在哪個系統上(只要它支持Docker), 都可以使用相同的Dockerfile來構建完全相同的鏡像,這確保了應用程序在不同環境之間的一致性和可移植性
2、可維護性: Dockerfile 中的指令清晰明了,記錄了構建鏡像所需的所有步驟和依賴關系。這使得其他開發人員或系統管理員能夠輕松理解、修改和重新構建鏡像,從而提高了系統的可維護性。
3、自動化:通過Dockerfile,可以自動化構建鏡像的過程,只需要一個命令 docker build,就可以根據Dockerfile中的指令,自動構建鏡像,無需手動執行一系列繁瑣的步驟
4、模塊化:在dockerfile中,可以定義多個步驟來構建鏡像,每個步驟都對應一個鏡像層,這種模塊化設計使得鏡像的構建更加靈活和可定制,例如,可以單獨構建包含基礎依賴的鏡像層,然后在需要時將其與其他應用程序層合并,從而創建完整的鏡像。
5、優化:Dockerfile允許對鏡像的構建過程進行優化,例如,通過將多個RUN指令合并成一個,可以減少鏡像的層數,從而減小鏡像的大小并提高構建速度,此外還可以使用緩存機制來加速重復的構成
6、安全性:Dockerfile中可以指定安全相關的設置,如使用非root用戶運行應用程序、限制應用程序的權限等。這些設置可以提高鏡像的安全性,減少潛在的安全風險。
7、多應用程序集成:通過Dockerfile,可以將多個SpringBoot應用程序集成到一個鏡像中。這對于需要同時運行多個服務的應用程序來說非常有用,因為它可以簡化部署和管理過程。通過將多個應用程序打包到一個鏡像中,可以減少鏡像的數量和復雜性,從而降低維護成本。
使用Dockerfile構建一個包含多個SpringBoot應用程序的鏡像可以提高系統的可移植性、可維護性、自動化程度、模塊化程度、優化程度、安全性和多應用程序集成能力。這些優點使得Dockerfile成為構建和管理Docker鏡像的重要工具之一。
1、FROM openjdk:8-jdk-alpine
這行代碼指定了構建鏡像的基礎鏡像是openjdk:8-jdk-alpine,使用了基于Alpine Linux的OpenJDK8鏡像作為起點
2、安裝tini
RUN apk add tini
Tini作為Docker容器中的init進程可以帶來許多好處,包括處理僵尸進程、確保信號的正確傳遞、輕量級且易于集成、兼容性強、提高穩定性和安全性以及簡單易用等。這些優勢使得Tini成為容器化應用中不可或缺的一部分。
?3、RUN mkdir /spring-boot-base
WORKDIR /spring-boot-base
首先通過 RUN mkdir /spring-boot-base 在鏡像中創建一個名為/spring-boot-base的目錄。然后,/WORKDIR /spring-boot-base 設置接下來的命令 的默認工作目錄為這個新創建的目錄
4、復制JAR文件
COPY ... /spring-boot-base
5、設置環境變量
ENV JAR_NAME= app-cloud.jar
6、創建日志目錄
RUN mkdir /root/app-logs
7、定義卷
VOLUME /root/app-logs
8、設置 ENTRYPOINT 和 CMD
ENTRYPOINT ["tini"]
CMD "java $JAVA_OPTS $ARGS -jar $JAR_NAME"
ENTRYPOINT
指令指定了容器啟動時運行的命令。這里設置為
tini,意味著
tini`將成為容器的主進程,并接管其他子進程的管理。
CMD
指令則指定了傳遞給ENTRYPOINT
的默認參數。這里,它告訴tini
要運行java
命令,并使用$JAVA_OPTS
(可能包含JVM選項)和$ARGS
(可能包含傳遞給容器的其他參數)來啟動名為$JAR_NAME
(即app-cloud.jar
)的JAR文件。
?Dockerfile創建了一個包含多個Spring Boot應用程序的Docker鏡像。它使用OpenJDK 8作為基礎,安裝了tini
,復制了多個JAR文件,設置了日志目錄,并指定了啟動命令來運行其中的一個JAR文件。由于使用了tini
,它可以更好地管理容器中的進程。同時,通過將日志目錄定義為卷,可以方便地進行日志的持久化存儲和提取。