Estoy buscando recoger una imagen acoplable para crear una aplicación Java y ver las variantes de las imágenes OpenJDK disponibles. Estoy buscando aquí https://github.com/docker-library/openjdk/tree/master/8/jdk y veo alpine, slim y windows. ¿Cuáles son las diferencias entre estos y qué da cada variante?
Elija una imagen base de la ventana acoplable que se ajuste a sus necesidades y tenga en cuenta que el tamaño de la imagen también es un aspecto importante .
La imagen se puede considerar como un conjunto de instrucciones sobre cómo crear el contenedor. En Docker, una imagen podría heredarse de otra imagen (o basarse en ella), agregando instrucciones adicionales además de las básicas. Cada imagen consta de múltiples capas, que son efectivamente inmutables.
Lea el artículo Elaboración del flujo de compilación perfecto de Java Docker .
El tamaño de la imagen de Docker es realmente muy importante. El tamaño tiene un impacto en:
- latencia de red : necesidad de transferir la imagen de Docker a través de la web
- almacenamiento : necesita almacenar todos estos bits en algún lugar
- disponibilidad y elasticidad del servicio : cuando se usa un programador Docker, como Kubernetes, Swarm, Nomad, DC/OS u otro (el programador puede mover contenedores entre hosts)
- seguridad : ¿realmente, quiero decir, realmente necesita el paquete libpng con todas sus vulnerabilidades CVE para su aplicación Java?
- agilidad de desarrollo : imágenes pequeñas de Docker == tiempo de compilación más rápido e implementación más rápida
Para ejecutar una aplicación Java, necesita al menos JRE. Por ejemplo, para un proyecto de primavera, su imagen puede basarse en slim Alpine Linux with OpenJDK JRE
:
#simple dockerFile for java app: #here we are using Base Alpine Linux based image with OpenJDK JRE only #For Java 8, try this FROM openjdk:8-jre-alpine #For Java 11, try this #FROM adoptopenjdk/openjdk11:alpine-jre #copy application WAR/JAR (with libraries inside) COPY target/spring-boot-*.war/jar yourName.war/jar # specify default command CMD ["/usr/bin/java", "-jar", "/yourName.war/jar"]
También puede usar el historial de la docker history yourImageName
para ver todas las capas (y su tamaño) que forman su imagen.
Según los documentos de la biblioteca docker (cita y enlaces a continuación), aquí hay un resumen:
openjdk:<version>
La imagen de facto. Úselo si no está seguro.
openjdk:<version>-buster
, openjdk:<version>-stretch
y openjdk:<version>-jessie
buster
, jessie
o stretch
son los nombres en clave de la suite para las versiones de Debian e indican en qué versión se basa la imagen.
openjdk:<version>-alpine
Del mismo modo, esta imagen se basa en Alpine Linux , por lo que es una imagen base muy pequeña. Se recomienda que si necesita un tamaño de imagen sea lo más pequeño posible. La advertencia es que usa algunas librerías inusuales, pero no debería ser un problema para la mayoría del software. En caso de duda, consulte los documentos oficiales a continuación.
openjdk:<version>
(desde 12 en adelante), openjdk:<version>-oracle
y openjdk:<version>-oraclelinux7
A partir de openjdk:12
la imagen predeterminada, así como las variantes -oracle
y -oraclelinux7
, se basan en la imagen oficial de Oracle Linux 7 . Los archivos binarios de OpenJDK en la imagen predeterminada, así como las variantes -oracle
y -oraclelinux7
, están creados por Oracle y provienen de la comunidad OpenJDK .
openjdk:<version>-slim
Esta imagen solo contiene los paquetes mínimos necesarios para ejecutar Java (y faltan muchas de las bibliotecas de Java relacionadas con la interfaz de usuario, por ejemplo). A menos que esté trabajando en un entorno en el que solo se implementará la imagen openjdk
y tenga limitaciones de espacio, se recomienda la imagen predeterminada sobre esta.
openjdk:<version>-windowsservercore
Esta imagen se basa en Windows Server Core ( microsoft/windowsservercore
) .
Documentos completos (la versión que se muestra a continuación aquí , la última versión aquí ):
Variantes de imagen
Las imágenes de
openjdk
vienen en muchos sabores, cada uno diseñado para un caso de uso específico.
openjdk:<version>
Esta es la imagen de facto. Si no está seguro de cuáles son sus necesidades, probablemente quiera usar esta. Está diseñado para usarse tanto como un contenedor desechable (monte su código fuente e inicie el contenedor para iniciar su aplicación), así como la base para construir otras imágenes.
Algunas de estas etiquetas pueden tener nombres como jessie o stretch. Estos son los nombres en clave de la suite para las versiones de Debian e indican en qué versión se basa la imagen.
openjdk:<version>-alpine
Esta imagen se basa en el popular proyecto Alpine Linux , disponible en la imagen oficial de
alpine
. Alpine Linux es mucho más pequeño que la mayoría de las imágenes base de distribución (~5 MB) y, por lo tanto, conduce a imágenes mucho más delgadas en general.Esta variante es muy recomendable cuando se desea que el tamaño final de la imagen sea lo más pequeño posible. La advertencia principal a tener en cuenta es que usa musl libc en lugar de glibc y amigos , por lo que cierto software puede tener problemas dependiendo de la profundidad de sus requisitos de libc. Sin embargo, la mayoría del software no tiene problemas con esto, por lo que esta variante suele ser una opción muy segura. Consulte este hilo de comentarios de Hacker News para obtener más información sobre los problemas que pueden surgir y algunas comparaciones de pros y contras del uso de imágenes basadas en Alpine.
Para minimizar el tamaño de la imagen, es poco común que se incluyan herramientas adicionales relacionadas (como
git
obash
) en las imágenes basadas en Alpine. Usando esta imagen como base, agregue las cosas que necesita en su propio Dockerfile (consulte la descripción de la imagenalpine
para ver ejemplos de cómo instalar paquetes si no está familiarizado).
openjdk:<version>-windowsservercore
Esta imagen se basa en Windows Server Core (
microsoft/windowsservercore
) . Como tal, solo funciona en lugares en los que funciona esa imagen, como Windows 10 Professional/Enterprise (Anniversary Edition) o Windows Server 2016.Para obtener información sobre cómo ejecutar Docker en Windows, consulte la guía "Inicio rápido" correspondiente proporcionada por Microsoft:
openjdk:<version>-slim
Esta imagen instala el paquete
-headless
de OpenJDK y, por lo tanto, faltan muchas de las bibliotecas de Java relacionadas con la interfaz de usuario y algunos paquetes comunes contenidos en la etiqueta predeterminada. Solo contiene los paquetes mínimos necesarios para ejecutar Java. A menos que esté trabajando en un entorno en el que solo se implementará la imagen deopenjdk
y tenga limitaciones de espacio, le recomendamos que utilice la imagen predeterminada de este repositorio.