Docker-Bilder - Typen. Slim vs Slim-Stretch vs Stretch vs Alpin

109

Ich suche nach einem Docker-Image, um eine Java-App zu erstellen, und schaue mir die Varianten der verfügbaren OpenJDK-Images an. Ich schaue hier https://github.com/docker-library/openjdk/tree/master/8/jdk und sehe alpine, schlanke und Fenster. Was sind die Unterschiede zwischen diesen und was gibt jede Variante?

mailtobash
quelle
Mögliches Duplikat von Python 3.7 Docker-Bildern
David Maze
Das Lesen der FROMZeilen der Docker-Dateien in dem von Ihnen angegebenen Link ist ebenfalls informativ. Die alpinen Bilder sind viel kleiner als die Debian-basierten Bilder, können aber auch auf verschiedene Weise auf Kompatibilitätsprobleme stoßen.
David Maze
1
Dies wird auch in der Image-README-Datei (auf der Image-Docker Hub-Seite ) erläutert .
David Maze

Antworten:

105

Hier finden Sie eine Zusammenfassung der Docker-Bibliotheksdokumente (Zitat und Links unten):

  • openjdk:<version>

Das defacto Bild. Verwenden Sie es, wenn Sie sich nicht sicher sind.

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

buster, jessieoder stretchsind die Suite-Codenamen für Debian- Versionen und geben an, auf welcher Version das Image basiert.

  • openjdk:<version>-alpine

In ähnlicher Weise basiert dieses Image auf Alpine Linux und ist somit ein sehr kleines Basis-Image. Es wird empfohlen, wenn Sie eine möglichst kleine Bildgröße benötigen. Die Einschränkung ist, dass es einige ungewöhnliche Bibliotheken verwendet, aber für die meisten Softwareprogramme kein Problem sein sollte. Überprüfen Sie im Zweifelsfall die offiziellen Dokumente unten.

  • openjdk:<version>(ab 12) openjdk:<version>-oracleundopenjdk:<version>-oraclelinux7

Beginnend mit openjdk:12dem Standard-Image sowie die -oracleund -oraclelinux7-Varianten basieren sie auf dem offiziellen Oracle Linux 7-Image . Die OpenJDK-Binärdateien im Standard-Image sowie die -oracleund -oraclelinux7-Varianten werden von Oracle erstellt und stammen aus der OpenJDK-Community .

  • openjdk:<version>-slim

Dieses Image enthält nur die minimalen Pakete, die zum Ausführen von Java erforderlich sind (und es fehlen beispielsweise viele der Java-Bibliotheken im Zusammenhang mit der Benutzeroberfläche). Sofern Sie nicht in einer Umgebung arbeiten, in der nur das openjdkImage bereitgestellt wird und Sie über Speicherplatzbeschränkungen verfügen, wird das Standard-Image gegenüber diesem empfohlen.

  • openjdk:<version>-windowsservercore

Dieses Image basiert auf Windows Server Core ( microsoft/windowsservercore) .



Vollständige Dokumentation ( Version hier unten , neueste Version hier ):

Bildvarianten

Die openjdkBilder gibt es in vielen Varianten, die jeweils für einen bestimmten Anwendungsfall entwickelt wurden.

openjdk:<version>

Dies ist das defacto Bild. Wenn Sie sich nicht sicher sind, was Ihre Bedürfnisse sind, möchten Sie diese wahrscheinlich verwenden. Es kann sowohl als Wegwerfcontainer (Mounten des Quellcodes und Starten des Containers zum Starten der App) als auch als Basis zum Erstellen anderer Bilder verwendet werden.

Einige dieser Tags enthalten möglicherweise Namen wie Jessie oder Stretch. Dies sind die Suite-Codenamen für Debian- Versionen und geben an, auf welcher Version das Image basiert.

openjdk:<version>-alpine

Dieses Bild basiert auf dem beliebten Alpine Linux - Projekt , in dem alpineoffiziellen Bild . Alpine Linux ist viel kleiner als die meisten Distributionsbasis-Images (~ 5 MB) und führt daher im Allgemeinen zu viel schlankeren Images.

Diese Variante wird dringend empfohlen, wenn die endgültige Bildgröße so klein wie möglich sein soll. Die wichtigste Einschränkung ist, dass musl libc anstelle von glibc und Freunden verwendet wird , sodass bei bestimmter Software je nach Tiefe der libc-Anforderungen Probleme auftreten können. Die meisten Softwareprogramme haben jedoch kein Problem damit, sodass diese Variante normalerweise eine sehr sichere Wahl ist. In diesem Kommentarthread zu Hacker News finden Sie weitere Informationen zu den möglicherweise auftretenden Problemen und einige Pro / Contra-Vergleiche zur Verwendung von Bildern auf Alpenbasis.

Um die Bildgröße zu minimieren, ist es ungewöhnlich, dass zusätzliche verwandte Tools (wie gitoder bash) in alpinen Bildern enthalten sind. Fügen Sie dieses Image als Basis hinzu und fügen Sie die benötigten Elemente in Ihre eigene Docker-Datei ein ( Beispiele zur Installation von Paketen finden Sie in der alpineImage-Beschreibung, wenn Sie nicht vertraut sind).

openjdk:<version>-windowsservercore

Dieses Image basiert auf Windows Server Core ( microsoft/windowsservercore) . Daher funktioniert es nur an Orten, an denen dieses Image funktioniert, z. B. Windows 10 Professional / Enterprise (Anniversary Edition) oder Windows Server 2016.

Informationen zum Ausführen von Docker unter Windows finden Sie in der entsprechenden "Kurzanleitung" von Microsoft:

openjdk:<version>-slim

In diesem Image wird das -headlessOpenJDK-Paket installiert, und es fehlen viele der UI-bezogenen Java-Bibliotheken und einige allgemeine Pakete, die im Standard-Tag enthalten sind. Es enthält nur die minimalen Pakete, die zum Ausführen von Java erforderlich sind. Sofern Sie nicht in einer Umgebung arbeiten, in der nur das openjdkImage bereitgestellt wird und Sie über Speicherplatzbeschränkungen verfügen, empfehlen wir dringend, das Standard-Image dieses Repositorys zu verwenden.

acdcjunior
quelle
1

Wählen Sie ein Basis-Docker-Image, das Ihren Anforderungen entspricht, und beachten Sie, dass die Bildgröße ebenfalls ein wichtiger Aspekt ist .

Das Bild kann als eine Anleitung zum Erstellen des Containers betrachtet werden. In Docker kann ein Bild von einem anderen Bild geerbt werden (oder darauf basieren), wobei zusätzliche Anweisungen zusätzlich zu den Basisbildern hinzugefügt werden. Jedes Bild besteht aus mehreren Ebenen, die effektiv unveränderlich sind.

Bitte lesen Sie Erstellen Sie den perfekten Java Docker Build Flow- Artikel.

Die Bildgröße des Dockers ist eigentlich sehr wichtig. Die Größe hat einen Einfluss auf:

  • Netzwerklatenz : Docker-Image muss über das Web übertragen werden
  • Speicherung : Alle diese Bits müssen irgendwo gespeichert werden
  • Serviceverfügbarkeit und -elastizität : Bei Verwendung eines Docker-Schedulers wie Kubernetes, Swarm, Nomad, DC / OS oder anderen (der Scheduler kann Container zwischen Hosts verschieben)
  • Sicherheit : Brauchen Sie wirklich das libpng-Paket mit all seinen CVE-Schwachstellen für Ihre Java-Anwendung?
  • Entwicklungsagilität : kleine Docker-Images == schnellere Erstellungszeit und schnellere Bereitstellung


Um eine Java-Anwendung auszuführen, benötigen Sie mindestens JRE. Für ein Frühlingsprojekt kann Ihr Bild beispielsweise auf Folgendem basieren 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"]

Sie können auch docker history yourImageNamealle Ebenen (und deren Größe) anzeigen, aus denen Ihr Bild besteht.

Ghasem Sadeghi
quelle