Images Docker - types. Slim vs slim-stretch vs stretch vs alpin

110

Je cherche à choisir une image docker pour créer une application java et à regarder les variantes des images OpenJDK disponibles. Je regarde ici https://github.com/docker-library/openjdk/tree/master/8/jdk et vois alpin, slim et windows. Quelles sont les différences entre ceux-ci et que donne chaque variante?

mailtobash
la source
Copie possible des images Docker Python 3.7
David Maze
La lecture des FROMlignes des Dockerfiles dans le lien que vous avez donné est également informative. Les images Alpine sont beaucoup plus petites que les images basées sur Debian, mais peuvent également rencontrer des problèmes de compatibilité de différentes manières.
David Maze
1
Ceci est également expliqué dans l'image README (à partir de la page image Docker Hub ).
David Maze

Réponses:

106

Par documentation de la bibliothèque docker (citation et liens ci-dessous), voici un résumé:

  • openjdk:<version>

L'image de facto. Utilisez-le en cas de doute.

  • openjdk:<version>-buster, openjdk:<version>-stretchetopenjdk:<version>-jessie

buster, jessieou stretchsont les noms de code de suite pour les versions de Debian et indiquent sur quelle version est basée l'image.

  • openjdk:<version>-alpine

De même, cette image est basée sur Alpine Linux , étant donc une très petite image de base. Il est recommandé si vous avez besoin d'une taille d'image aussi petite que possible. La mise en garde est qu'il utilise des bibliothèques inhabituelles, mais ne devrait pas être un problème pour la plupart des logiciels. En cas de doute, consultez les documents officiels ci-dessous.

  • openjdk:<version>(à partir de 12 ans), openjdk:<version>-oracleetopenjdk:<version>-oraclelinux7

En commençant par openjdk:12l'image par défaut ainsi que les variantes -oracleet -oraclelinux7sont basées sur l'image officielle d' Oracle Linux 7 . Les binaires OpenJDK de l'image par défaut ainsi que les variantes -oracleet -oraclelinux7sont créés par Oracle et proviennent de la communauté OpenJDK .

  • openjdk:<version>-slim

Cette image ne contient que les packages minimaux nécessaires pour exécuter Java (et il manque de nombreuses bibliothèques Java liées à l'interface utilisateur, par exemple). Sauf si vous travaillez dans un environnement où seule l' openjdkimage sera déployée et que vous avez des contraintes d'espace, l'image par défaut est recommandée sur celle-ci.

  • openjdk:<version>-windowsservercore

Cette image est basée sur Windows Server Core ( microsoft/windowsservercore) .



Documents complets ( version ci-dessous ici , dernière version ici ):

Variantes d'image

Les openjdkimages sont disponibles dans de nombreuses saveurs, chacune conçue pour un cas d'utilisation spécifique.

openjdk:<version>

C'est l'image de facto. Si vous n'êtes pas sûr de vos besoins, vous souhaiterez probablement utiliser celui-ci. Il est conçu pour être utilisé à la fois comme conteneur à jeter (montez votre code source et démarrez le conteneur pour démarrer votre application), ainsi que comme base pour créer d'autres images.

Certaines de ces balises peuvent avoir des noms comme jessie ou s'étirer. Ce sont les noms de code de suite pour les versions de Debian et indiquent sur quelle version est basée l'image.

openjdk:<version>-alpine

Cette image est basée sur le célèbre projet Alpine Linux , disponible dans l' alpineimage officielle . Alpine Linux est beaucoup plus petit que la plupart des images de base de distribution (~ 5 Mo), et conduit donc à des images beaucoup plus minces en général.

Cette variante est fortement recommandée lorsque la taille finale de l'image est la plus petite possible. La principale mise en garde à noter est qu'il utilise musl libc au lieu de la glibc et de ses amis , donc certains logiciels peuvent rencontrer des problèmes en fonction de la profondeur de leurs exigences en matière de libc. Cependant, la plupart des logiciels n'ont pas de problème avec cela, donc cette variante est généralement un choix très sûr. Voir ce fil de commentaires Hacker News pour plus de discussion sur les problèmes qui pourraient survenir et quelques comparaisons pour / contre de l'utilisation d'images basées sur Alpine.

Pour minimiser la taille de l'image, il est rare que des outils connexes supplémentaires (tels que gitou bash) soient inclus dans les images alpines. En utilisant cette image comme base, ajoutez les éléments dont vous avez besoin dans votre propre fichier Docker (voir la alpinedescription de l' image pour des exemples sur la façon d'installer des packages si vous n'êtes pas familier).

openjdk:<version>-windowsservercore

Cette image est basée sur Windows Server Core ( microsoft/windowsservercore) . En tant que tel, cela ne fonctionne que dans les endroits où cette image le fait, tels que Windows 10 Professionnel / Entreprise (Édition anniversaire) ou Windows Server 2016.

Pour plus d'informations sur la façon de faire fonctionner Docker sous Windows, veuillez consulter le guide "Démarrage rapide" correspondant fourni par Microsoft:

openjdk:<version>-slim

Cette image installe le -headlesspackage d'OpenJDK et il manque donc de nombreuses bibliothèques Java liées à l'interface utilisateur et certains packages communs contenus dans la balise par défaut. Il ne contient que les packages minimaux nécessaires pour exécuter Java. Sauf si vous travaillez dans un environnement où seule l' openjdkimage sera déployée et que vous avez des contraintes d'espace, nous vous recommandons vivement d'utiliser l'image par défaut de ce référentiel.

acdcjunior
la source
1

Choisissez une image docker de base qui correspond à vos besoins et gardez à l'esprit que la taille de l'image est également un aspect important .

L'image peut être considérée comme un ensemble d'instructions sur la façon de créer le conteneur. Dans Docker, une image peut être héritée (ou basée sur) une autre image, en ajoutant des instructions supplémentaires en plus de celles de base. Chaque image se compose de plusieurs couches, qui sont effectivement immuables.

Veuillez lire l'article Créer le parfait flux de construction Java Docker .

La taille de l'image Docker est en fait très importante. La taille a un impact sur:

  • latence du réseau : besoin de transférer l'image Docker sur le Web
  • stockage : besoin de stocker tous ces bits quelque part
  • disponibilité et élasticité du service : lors de l'utilisation d'un planificateur Docker, comme Kubernetes, Swarm, Nomad, DC / OS ou autre (le planificateur peut déplacer des conteneurs entre les hôtes)
  • sécurité : avez-vous vraiment, je veux dire vraiment besoin du paquet libpng avec toutes ses vulnérabilités CVE pour votre application Java?
  • agilité de développement : petites images Docker == temps de construction plus rapide et déploiement plus rapide


Pour exécuter une application Java, vous avez au moins besoin de JRE. Par exemple, pour un projet de printemps, votre image peut être basée sur 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"]

Vous pouvez également utiliser docker history yourImageNamepour voir tous les calques (et leur taille) qui composent votre image.

Ghasem Sadeghi
la source