Explicación detallada de la aplicación SpringBoot (2.3) para hacer una imagen de Docker (solución oficial)

Acerca de la serie "Tecnología de contenedorización SpringBoot-2.3"

  • La serie "SpringBoot-2.3 Containerization Technology" tiene como objetivo aprender y practicar la última tecnología de contenedorización traída por la versión 2.3 junto con todos, para que nuestras aplicaciones Java puedan adaptarse más al entorno de contenedor, manteniéndose al día con la corriente principal en la era de la computación en la nube y manteniendo la competitividad ;
  • Toda la serie de artículos se divide en dos partes, la temática y la auxiliar, la parte temática es la siguiente:
  1. "Experimentar la aplicación SpringBoot (2.3) haciendo una imagen de Docker (solución oficial)" ;
  2. "Explicación detallada de la aplicación SpringBoot (2.3) que crea la imagen de Docker (solución oficial)" ;
  3. "Dominar las sondas de contenedor SpringBoot-2.3: conceptos básicos" ;
  4. "Dominar las sondas de contenedor SpringBoot-2.3: capítulo en profundidad" ;
  5. "Dominar la sonda de contenedores de SpringBoot-2.3: combate real" ;
  • La parte auxiliar es un resumen de algunos materiales de referencia y notas, como sigue:
  1. "¿Por qué las soluciones de duplicación SpringBoot-2.3 tienen múltiples capas?" ;
  2. "Configure una cuenta no root para ejecutar directamente los comandos de la ventana acoplable sin sudo" ;
  3. "Fase de desarrollo, despliegue rápido de aplicaciones SpringBoot en K8S" ;

Introducción

En lo anterior , experimente rápidamente el programa oficial de producción de imágenes de Docker recomendado, pero también tuvo algunas preguntas:

  1. ¿Cuál es la diferencia entre el esquema de construcción de imágenes recomendado de SpringBoot-2.3 y la versión anterior?
  2. ¿Qué hicieron exactamente los nuevos parámetros de spring-boot-maven-plugin en pom.xml ?
  3. En el Dockerfile, ¿qué significa la operación java -Djarmode = layertools -jar application.jar extract ?

El objetivo de este artículo es responder a las preguntas anteriores, continuar llenando puntos de conocimiento en el proceso de encontrar respuestas y mejorar;

Puntos clave de conocimiento: capa de espejo

¿Qué es la capa de espejo mencionada muchas veces en el artículo anterior y por qué hay una capa de múltiples capas? Es necesario consolidar este punto de conocimiento primero, consulte el artículo "¿Por qué el esquema de duplicación SpringBoot-2.3 tiene múltiples capas?"

La solución oficial de la versión antigua de SpringBoot

Tome la versión SpringBoot-2.2.0.RELEASE como ejemplo, el documento oficial (
https://docs.spring.io/spring-boot/docs/2.2.0.RELEASE/reference/pdf/spring-boot-reference.pdf) da El enfoque es el siguiente:

  1. Compile y cree el proyecto SpringBoot y obtenga el jar en el directorio de destino;
  2. Cree una carpeta de dependencia en el directorio de destino;
  3. Descomprima el jar en la carpeta de dependencia;
  4. Escriba el archivo Dockerfile, el contenido es el siguiente:
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG DEPENDENCY=target/dependency
COPY ${DEPENDENCY}/BOOT-INF/lib /app/lib
COPY ${DEPENDENCY}/META-INF /app/META-INF
COPY ${DEPENDENCY}/BOOT-INF/classes /app
ENTRYPOINT ["java","-cp","app:app/lib/*","com.example.MyApplication"]
  1. Se puede ver que el método oficial recomendado es descomprimir todo el archivo jar y usar el comando COPY para copiarlo varias veces en el Dockerfile. Los beneficios de esto son obvios: múltiples capas, si solo se modifica el código de la aplicación en la nueva versión de la imagen, luego al descargar la imagen Solo descargue la capa / app, y las otras partes usan directamente la caché local, que es un método de optimización convencional para la duplicación de docker;
  2. El esquema anterior tiene un pequeño problema: ¡problema! ! !
  3. Así que la versión 2.3.0.RELEASE ha realizado algunas optimizaciones para facilitar las cosas;

2.3.0. La diferencia entre el esquema de la versión RELEASE y la versión anterior

Los pasos para compilar Docker para la versión 2.3.0.RELEASE son los siguientes:

  1. Agregue un elemento de configuración al complemento spring-boot-maven-plugin en pom.xml;
    2. Compile y compile para generar jar;
  2. Escriba un Dockerfile, que utilice compilaciones de varias etapas. Después de extraer la división del contenedor con herramientas, ejecute el comando COPY varias veces para colocar el contenido dividido en el espejo para lograr el propósito de varias capas;

Por lo tanto, en comparación con la versión anterior, la versión 2.3.0.RELEASE presenta los siguientes cambios:

  1. Hay un parámetro adicional en pom.xml ;
  2. Una vez creado el frasco, no es necesario que lo descomprima usted mismo;
  3. El contenido de Dockefile es diferente. En la versión anterior, el jar se descomprime manualmente y luego se copia por separado en el Dockerfile. 2.3.0.RELEASE es extraer cada parte del contenido del jar a través del comando java ;

Después de aclarar la diferencia entre la versión nueva y la antigua, continuemos estudiando la siguiente pregunta;

Nuevos parámetros del complemento spring-boot-maven-plugin en pom.xml

  1. Los nuevos parámetros del complemento pring-boot-maven-plugin se muestran en la siguiente figura:
    Inserte la descripción de la imagen aquí
  2. ¿Cuál es el uso de los parámetros anteriores? Compilé y construí el frasco dos veces aquí. La primera vez que tuve los parámetros anteriores, la segunda vez no los tuve. Después de descomprimir los dos frascos generados, descubrí que después de usar los parámetros anteriores, el frasco generado aparecerá en el cuadro rojo a continuación. Los dos archivos:
    Inserte la descripción de la imagen aquí
  3. Mire el contenido del archivo layer.idx , como se muestra a continuación:
    Inserte la descripción de la imagen aquí
  4. ¿Qué significa el contenido de la imagen de arriba? El funcionario ha dado una explicación detallada, como se muestra en el cuadro rojo a continuación:
    Inserte la descripción de la imagen aquí
  5. En resumen, el archivo layer.idx es una lista que registra toda la información que se va a copiar al espejo. A continuación, veamos cómo usar el archivo layer.idx. Esto involucra otro archivo agregado al paquete jar: spring-boot-jarmode-layertools-2.3.0.RELEASE.jar

primavera-botas-jarmode-layertools 工具

  1. Como se mencionó anteriormente, además de layer.idx, hay otro archivo en el jar: spring-boot-jarmode-layertools-2.3.0.RELEASE.jar , echemos un vistazo a la utilidad de este archivo;
  2. Ingrese el directorio de destino del proyecto , que es el archivo jar compilado (el nombre del archivo aquí es dockerlayerdemo-0.0.1-SNAPSHOT.jar), tenga en cuenta que el plugin spring-boot-maven-plugin en este momento se presenta con la imagen roja a continuación Los parámetros de la caja:
    Inserte la descripción de la imagen aquí
  3. Ejecute los siguientes comandos:
java -Djarmode=layertools -jar dockerlayerdemo-0.0.1-SNAPSHOT.jar list
  1. El resultado se muestra en la siguiente figura, que es el contenido del archivo layer.idx:
    Inserte la descripción de la imagen aquí
  2. Echemos un vistazo a la explicación oficial de estas herramientas de capa . Ya hemos experimentado la función del parámetro de lista anterior. El foco está en el parámetro de extracción en el cuadro rojo . Su función es extraer el contenido necesario para construir la imagen del frasco:
    Inserte la descripción de la imagen aquí
  3. Al ver esto, ¿piensa en el contenido de Dockerfile en "Experimentar la aplicación SpringBoot (2.3) haciendo una imagen de Docker (solución oficial)" , vea el cuadro rojo y las letras rojas en la figura a continuación, tiene una sensación de darse cuenta repentinamente: capas de lista de compilación de jar .idx, Dockerfile extrae los archivos del jar de acuerdo con la lista y los coloca en el espejo: Hasta
    Inserte la descripción de la imagen aquí
    ahora, se han encontrado las respuestas a las tres preguntas. Para resumir:

¿Cuál es la diferencia entre el esquema de construcción del espejo recomendado por SpringBoot-2.3.0.RELEASE y la versión anterior?

  1. Agregue un elemento de configuración al complemento spring-boot-maven-plugin en pom.xml;
  2. Después de que se construye el jar, la versión anterior necesita descomprimir el jar por sí mismo, la nueva versión no es necesario;
  3. En la nueva versión del jar, hay más listas de archivos layer.idx y la herramienta de procesamiento de archivos de imagen spring-boot-jarmode-layertools-2.3.0.RELEASE.jar ;
  4. El contenido de la versión antigua del Dockefile: debido a que se realizó la descompresión anterior, todo el contenido previamente descomprimido se copia directamente en el Dockerfile, aquí existe un riesgo: la ubicación del archivo de la descompresión anterior y la copia actual deben ser iguales;
  5. La nueva versión del contenido de Dockerfile: use la herramienta spring-boot-jarmode-layertools-2.3.0.RELEASE.jar, extraiga los archivos del jar de acuerdo con el contenido de layer.idx y cópielos en el espejo;
  6. En la nueva versión de Dockerfile, debido al uso de la construcción por etapas, la operación de extraer archivos del jar no se guardará en la capa reflejada;

¿Cuáles son los nuevos parámetros de spring-boot-maven-plugin en pom.xml?

Los nuevos parámetros del plugin spring-boot-maven-plugin crean dos archivos más en el jar que se obtienen compilando y compilando, como se muestra en la siguiente figura:
Inserte la descripción de la imagen aquí

En el Dockerfile, ¿qué significa la operación java -Djarmode = layertools -jar application.jar extract?

  1. La función de java -Djarmode = layertools -jar application.jar extract es extraer archivos del jar, que son parte de la imagen de la ventana acoplable;
  2. El parámetro de la operación anterior es extracto , y hay otros dos parámetros.La explicación oficial de su función es la siguiente: Hasta
    Inserte la descripción de la imagen aquí
    ahora, el problema ha sido aclarado, creo que tiene suficiente comprensión del plan oficial de construcción de imágenes SpringBoot-2.3.0.RELEASE, y el último es Dibujé un diagrama de flujo basado en mi propio conocimiento para ayudarlo a comprender rápidamente todo el proceso de construcción:
    Inserte la descripción de la imagen aquí

Bienvenido a mi GitHub

  • Dirección: https://github.com/zq2599/blog_demos
  • Contenido: Clasificación y resumen de artículos originales y código fuente de apoyo, que involucre Java, Docker, K8S, DevOPS, etc.

Bienvenido a seguir mi cuenta pública: programador Xin Chen

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/boling_cavalry/article/details/106598189
Recomendado
Clasificación