Immagini Docker - tipi. Slim vs slim-stretch vs stretch vs alpino


110

Sto cercando di prendere un'immagine docker per creare un'app java e guardare le varianti delle immagini OpenJDK disponibili. Sto cercando qui https://github.com/docker-library/openjdk/tree/master/8/jdk e vedo alpine, slim e windows. Quali sono le differenze tra questi e cosa offre ciascuna variante?


Possibile duplicato delle immagini Docker
David Maze

Anche leggere le FROMrighe dei Dockerfile nel link che hai fornito è informativo. Le immagini Alpine sono molto più piccole delle immagini basate su Debian, ma possono anche incontrare problemi di compatibilità in vari modi.
David Maze

1
Questo è spiegato anche nell'immagine README (dalla pagina Docker Hub dell'immagine ).
David Maze

Risposte:


106

Per i documenti della libreria docker (citazione e link di seguito), ecco un riepilogo:

  • openjdk:<version>

L'immagine di fatto. Usalo se non sei sicuro.

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

buster, jessieo stretchsono i nomi in codice della suite per i rilasci di Debian e indicano su quale versione si basa l'immagine.

  • openjdk:<version>-alpine

Allo stesso modo, questa immagine è basata su Alpine Linux , essendo quindi un'immagine di base molto piccola. Si consiglia se è necessario che le dimensioni dell'immagine siano le più piccole possibili. L'avvertenza è che utilizza alcune librerie insolite, ma non dovrebbe essere un problema per la maggior parte del software. In caso di dubbio, controlla i documenti ufficiali di seguito.

  • openjdk:<version>(da 12 in poi) openjdk:<version>-oracleeopenjdk:<version>-oraclelinux7

A partire openjdk:12dall'immagine predefinita, le varianti -oraclee -oraclelinux7si basano sull'immagine ufficiale di Oracle Linux 7 . I binari di OpenJDK nell'immagine predefinita così come i file -oraclee-oraclelinux7 varianti sono creati da Oracle e provengono dalla comunità OpenJDK .

  • openjdk:<version>-slim

Questa immagine contiene solo i pacchetti minimi necessari per eseguire Java (e mancano molte delle librerie Java relative all'interfaccia utente, ad esempio). A meno che tu non stia lavorando in un ambiente in cui soloopenjdk verrà distribuita l' immagine e si dispone di vincoli di spazio, l'immagine predefinita è consigliata rispetto a questa.

  • openjdk:<version>-windowsservercore

Questa immagine è basata su Windows Server Core ( microsoft/windowsservercore) .



Documenti completi ( versione mostrata qui sotto , ultima versione qui ):

Varianti di immagine

Il openjdk immagini sono disponibili in molti gusti, ciascuno progettato per un caso d'uso specifico.

openjdk:<version>

Questa è l'immagine di fatto. Se non sei sicuro di quali siano le tue esigenze, probabilmente vorrai usare questo. È progettato per essere utilizzato sia come contenitore usa e getta (monta il codice sorgente e avvia il contenitore per avviare la tua app), sia come base da cui creare altre immagini.

Alcuni di questi tag possono contenere nomi come jessie o stretch. Questi sono i nomi in codice della suite per i rilasci di Debian e indicano su quale versione si basa l'immagine.

openjdk:<version>-alpine

Questa immagine è basata sul popolare progetto Alpine Linux , disponibile in l' alpineimmagine ufficiale . Alpine Linux è molto più piccolo della maggior parte delle immagini di base di distribuzione (~ 5 MB) e quindi porta a immagini molto più sottili in generale.

Questa variante è altamente raccomandata quando si desidera che la dimensione finale dell'immagine sia il più piccola possibile. L'avvertenza principale da notare è che utilizza musl libc invece di glibc e amici , quindi alcuni software potrebbero incorrere in problemi a seconda della profondità dei loro requisiti libc. Tuttavia, la maggior parte del software non ha problemi con questo, quindi questa variante è solitamente una scelta molto sicura. Vedere questo thread di commenti su Hacker News per ulteriori discussioni sui problemi che potrebbero sorgere e alcuni confronti pro / contro dell'utilizzo di immagini basate su Alpine.

Per ridurre al minimo le dimensioni dell'immagine, è raro che ulteriori strumenti correlati (come gito bash) vengano inclusi nelle immagini basate su Alpine. Usando questa immagine come base, aggiungi le cose che ti servono nel tuo Dockerfile (vedi la alpinedescrizione dell'immagine per esempi di come installare i pacchetti se non hai familiarità).

openjdk:<version>-windowsservercore

Questa immagine è basata su Windows Server Core ( microsoft/windowsservercore) . In quanto tale, funziona solo in luoghi in cui funziona l'immagine, come Windows 10 Professional / Enterprise (Anniversary Edition) o Windows Server 2016.

Per informazioni su come eseguire Docker su Windows, consultare la relativa guida "Quick Start" fornita da Microsoft:

openjdk:<version>-slim

Questa immagine installa il -headlesspacchetto di OpenJDK e quindi mancano molte delle librerie Java relative all'interfaccia utente e alcuni pacchetti comuni contenuti nel tag predefinito. Contiene solo i pacchetti minimi necessari per eseguire Java. A meno che tu non stia lavorando in un ambiente in cui verrà distribuita solo l' openjdkimmagine e hai vincoli di spazio, ti consigliamo vivamente di utilizzare l'immagine predefinita di questo repository.


1

Scegli un'immagine di base docker che si adatti alle tue esigenze e tieni presente che anche la dimensione dell'immagine è un aspetto importante .

L'immagine può essere considerata come un insieme di istruzioni su come creare il contenitore. In Docker, un'immagine potrebbe essere ereditata da (o basata su) un'altra immagine, aggiungendo istruzioni aggiuntive sopra quelle di base. Ogni immagine è composta da più livelli, che sono effettivamente immutabili.

Per favore leggi l'articolo Creare il perfetto flusso di build Java Docker .

La dimensione dell'immagine Docker è in realtà molto importante. La dimensione ha un impatto su:

  • latenza di rete : è necessario trasferire l'immagine Docker sul web
  • archiviazione : è necessario memorizzare tutti questi bit da qualche parte
  • disponibilità ed elasticità del servizio : quando si utilizza uno scheduler Docker, come Kubernetes, Swarm, Nomad, DC / OS o altro (lo scheduler può spostare i container tra host)
  • sicurezza : davvero, voglio dire, hai davvero bisogno del pacchetto libpng con tutte le sue vulnerabilità CVE per la tua applicazione Java?
  • agilità di sviluppo : piccole immagini Docker == tempi di compilazione più rapidi e distribuzione più rapida


Per eseguire un'applicazione java è necessario almeno JRE. Ad esempio, per un progetto primaverile la tua immagine può essere basata su 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"]

Inoltre puoi usare docker history yourImageNameper vedere tutti i livelli (e le loro dimensioni) che compongono la tua immagine.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.