Obrazy Dockera - typy. Slim vs slim-stretch vs stretch vs alpine

110

Chcę pobrać obraz dockera, aby zbudować aplikację java i spojrzeć na dostępne warianty obrazów OpenJDK. Patrzę tutaj https://github.com/docker-library/openjdk/tree/master/8/jdk i widzę alpejskie, smukłe i okna. Jakie są między nimi różnice i co daje każdy wariant?

mailtobash
źródło
Możliwa kopia obrazów Dockera
David Maze
FROMPouczające jest również przeczytanie wierszy plików Dockerfiles w podanym łączu. Obrazy Alpine są znacznie mniejsze niż obrazy oparte na Debianie, ale mogą również napotkać problemy ze zgodnością na różne sposoby.
David Maze
1
Jest to również wyjaśnione w pliku README obrazu (ze strony Image Docker Hub ).
David Maze

Odpowiedzi:

106

Oto podsumowanie dla dokumentów biblioteki docker (cytat i linki poniżej):

  • openjdk:<version>

Obraz defacto. Użyj go, jeśli nie masz pewności.

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

buster, jessielub stretchsą nazwami kodowymi pakietów dla wydań Debiana i wskazują, na którym wydaniu jest oparty obraz.

  • openjdk:<version>-alpine

Podobnie, ten obraz jest oparty na systemie Alpine Linux , a zatem jest bardzo małym obrazem podstawowym. Zaleca się, jeśli potrzebujesz, aby rozmiar obrazu był jak najmniejszy. Zastrzeżeniem jest to, że używa niektórych nietypowych bibliotek, ale nie powinno stanowić problemu dla większości programów. W razie wątpliwości sprawdź oficjalne dokumenty poniżej.

  • openjdk:<version>(od 12 roku) openjdk:<version>-oracleiopenjdk:<version>-oraclelinux7

Począwszy openjdk:12od domyślnego obrazu, a także warianty -oraclei -oraclelinux7są oparte na oficjalnym obrazie Oracle Linux 7 . Pliki binarne OpenJDK w domyślnym obrazie, jak również warianty -oraclei -oraclelinux7są tworzone przez Oracle i pochodzą od społeczności OpenJDK .

  • openjdk:<version>-slim

Ten obraz zawiera tylko minimalne pakiety potrzebne do uruchomienia języka Java (i brakuje na przykład wielu bibliotek Java związanych z interfejsem użytkownika). Chyba że pracuje w środowisku, w którym tylkoopenjdk obraz zostanie wdrożony i masz ograniczoną przestrzeń, domyślny obraz jest zalecany przez ten jeden.

  • openjdk:<version>-windowsservercore

Ten obraz jest oparty na systemie Windows Server Core ( microsoft/windowsservercore) .



Pełna dokumentacja ( wersja pokazana poniżej , najnowsza wersja tutaj ):

Warianty obrazu

Te openjdkobrazy są w wielu smakach, każdy przeznaczony dla przypadku szczególnego zastosowania.

openjdk:<version>

To jest obraz defacto. Jeśli nie masz pewności, jakie są Twoje potrzeby, prawdopodobnie zechcesz skorzystać z tego. Jest przeznaczony do użycia zarówno jako kontener do wyrzucenia (zamontuj kod źródłowy i uruchom kontener, aby uruchomić aplikację), a także jako baza do tworzenia innych obrazów.

Niektóre z tych tagów mogą mieć nazwy takie jak jessie lub stretch. Są to nazwy kodowe pakietów dla wydań Debiana i wskazują, na którym wydaniu jest oparty obraz.

openjdk:<version>-alpine

Ten obraz jest oparty na popularnym projekcie Alpine Linux , dostępnym na alpineoficjalnym obrazie . Alpine Linux jest znacznie mniejszy niż większość obrazów podstawowych dystrybucji (~ 5 MB), a zatem ogólnie prowadzi do znacznie cieńszych obrazów.

Ten wariant jest wysoce zalecany, gdy pożądany jest jak najmniejszy rozmiar obrazu końcowego. Głównym zastrzeżeniem, na które należy zwrócić uwagę, jest to, że używa on musl libc zamiast glibc i friends , więc niektóre programy mogą napotkać problemy w zależności od głębokości ich wymagań dotyczących libc. Jednak większość programów nie ma z tym problemu, więc ten wariant jest zwykle bardzo bezpiecznym wyborem. Zobacz ten wątek z komentarzami Hacker News, aby uzyskać więcej dyskusji na temat problemów, które mogą się pojawić, i kilka porównań za / przeciw używania obrazów z Alpine.

Aby zminimalizować rozmiar obrazu, rzadko zdarza się, aby dodatkowe powiązane narzędzia (takie jak gitlub bash) były dołączane do obrazów opartych na Alpine. Używając tego obrazu jako podstawy, dodaj potrzebne rzeczy do własnego pliku Dockerfile (zobacz alpineopis obrazu, aby zapoznać się z przykładami instalowania pakietów, jeśli nie jesteś zaznajomiony).

openjdk:<version>-windowsservercore

Ten obraz jest oparty na systemie Windows Server Core ( microsoft/windowsservercore) . W związku z tym działa tylko w miejscach, w których działa ten obraz, takich jak Windows 10 Professional / Enterprise (Anniversary Edition) lub Windows Server 2016.

Aby uzyskać informacje o tym, jak uruchomić platformę Docker w systemie Windows, zapoznaj się z odpowiednim przewodnikiem „Szybki start” dostarczonym przez firmę Microsoft:

openjdk:<version>-slim

Ten obraz instaluje -headlesspakiet OpenJDK, w związku z czym brakuje wielu bibliotek Java związanych z interfejsem użytkownika oraz niektórych typowych pakietów zawartych w znaczniku domyślnym. Zawiera tylko minimalne pakiety potrzebne do uruchomienia Javy. Chyba że pracuje w środowisku, w którym tylkoopenjdk obraz zostanie wdrożony i masz ograniczoną przestrzeń, zalecamy przy użyciu domyślnego obrazu tego repozytorium.

acdcjunior
źródło
1

Wybierz podstawowy obraz dockera, który odpowiada Twoim potrzebom i pamiętaj, że rozmiar obrazu jest również ważnym aspektem .

Obraz można traktować jako zbiór instrukcji dotyczących tworzenia kontenera. W Dockerze jeden obraz może być dziedziczony z innego obrazu (lub oparty na nim), dodając dodatkowe instrukcje oprócz podstawowych. Każdy obraz składa się z wielu warstw, które są praktycznie niezmienne.

Przeczytaj artykuł Crafting the perfect Java Docker build flow article.

Rozmiar obrazu Dockera jest w rzeczywistości bardzo ważny. Rozmiar ma wpływ na:

  • opóźnienie sieci : trzeba przesłać obraz Dockera przez Internet
  • przechowywanie : musisz gdzieś przechowywać wszystkie te bity
  • dostępność i elastyczność usług : w przypadku korzystania z harmonogramu Docker, takiego jak Kubernetes, Swarm, Nomad, DC / OS lub inne (harmonogram może przenosić kontenery między hostami)
  • bezpieczeństwo : czy naprawdę, mam na myśli, że naprawdę potrzebujesz pakietu libpng ze wszystkimi jego lukami CVE do twojej aplikacji Java?
  • elastyczność programowania : małe obrazy Dockera == krótszy czas kompilacji i szybsze wdrażanie


Aby uruchomić aplikację java, potrzebujesz przynajmniej JRE. Na przykład w przypadku projektu wiosennego obraz może być oparty na 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"]

Możesz także użyć, docker history yourImageNameaby zobaczyć wszystkie warstwy (i ich rozmiar), które tworzą twój obraz.

Ghasem Sadeghi
źródło