Imágenes de Docker: tipos. Slim vs slim-stretch vs stretch vs alpine

110

Estoy buscando tomar una imagen de la ventana acoplable para crear una aplicación Java y observar 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é aporta cada variante?

mailtobash
fuente
Posible duplicado de imágenes de Docker
David Maze
Leer las FROMlíneas de los Dockerfiles en el enlace que proporcionó también es informativo. Las imágenes de Alpine son mucho más pequeñas que las imágenes basadas en Debian, pero también pueden encontrar problemas de compatibilidad de varias formas.
David Maze
1
Esto también se explica en la imagen README (de la página de la imagen Docker Hub ).
David Maze

Respuestas:

106

Según los documentos de la biblioteca de 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>-stretchyopenjdk:<version>-jessie

buster, jessieo stretchson los nombres de código 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 está basada en Alpine Linux , por lo que es una imagen base muy pequeña. Se recomienda si necesita un tamaño de imagen lo más pequeño posible. La advertencia es que utiliza algunas bibliotecas 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>(de 12 en adelante), openjdk:<version>-oracleyopenjdk:<version>-oraclelinux7

Comenzando con openjdk:12la imagen predeterminada, así como las variantes -oracley, -oraclelinux7se basan en la imagen oficial de Oracle Linux 7 . Los binarios de OpenJDK en la imagen predeterminada, así como las variantes -oracley, -oraclelinux7son 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 donde soloopenjdk se implementará la imagen y tiene limitaciones de espacio, se recomienda la imagen predeterminada en lugar de esta.

  • openjdk:<version>-windowsservercore

Esta imagen está basada en Windows Server Core ( microsoft/windowsservercore) .



Documentos completos (la versión se muestra a continuación aquí , la última versión aquí ):

Variantes de imagen

Las openjdkimágenes 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 desee utilizar este. Está diseñado para usarse tanto como un contenedor desechable (monta tu código fuente e inicia el contenedor para iniciar tu aplicación), así como la base para construir otras imágenes a partir de.

Algunas de estas etiquetas pueden tener nombres como jessie o estirarse. Estos son los nombres de código 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 alpineimagen oficial . 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, genera 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 principal advertencia a tener en cuenta es que usa musl libc en lugar de glibc y friends , 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 podrían surgir y algunas comparaciones a favor y en contra 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 gito bash) en las imágenes basadas en Alpine. Usando esta imagen como base, agregue las cosas que necesita en su propio Dockerfile (vea la alpinedescripción de la imagen para ver ejemplos de cómo instalar paquetes si no está familiarizado).

openjdk:<version>-windowsservercore

Esta imagen está basada en Windows Server Core ( microsoft/windowsservercore) . Como tal, solo funciona en lugares donde esa imagen lo hace, 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 de "Inicio rápido" correspondiente proporcionada por Microsoft:

openjdk:<version>-slim

Esta imagen instala el -headlesspaquete de OpenJDK y, por lo tanto, faltan muchas de las bibliotecas 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 soloopenjdk se implementará la imagen y tiene limitaciones de espacio, le recomendamos que utilice la imagen predeterminada de este repositorio.

acdcjunior
fuente
1

Elija una imagen de la ventana acoplable base que se adapte 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 (o basarse en) otra imagen, agregando instrucciones adicionales sobre las base. Cada imagen consta de varias capas, que son efectivamente inmutables.

Lea el artículo Cómo crear el 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 : es necesario transferir la imagen de Docker a través de la web
  • almacenamiento : es necesario almacenar todos estos bits en algún lugar
  • disponibilidad y elasticidad del servicio : cuando se utiliza un programador de 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 de Docker pequeñas == tiempo de compilación más rápido y una 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 puedes usar docker history yourImageNamepara ver todas las capas (y su tamaño) que conforma tu imagen.

Ghasem Sadeghi
fuente