Образы докеров - типы. Slim vs slim-stretch vs stretch vs alpine

110

Я ищу образ докера для создания Java-приложения и смотрю на варианты доступных образов OpenJDK. Я смотрю здесь https://github.com/docker-library/openjdk/tree/master/8/jdk и вижу alpine, slim и windows. В чем разница между ними и что дает каждый вариант?

mailtobash
источник
Возможный дубликат образов Python 3.7 Docker
Дэвид Мейз
Чтение FROMстрок Dockerfiles в приведенной вами ссылке также является информативным. Образы Alpine намного меньше, чем образы на основе Debian, но также могут вызывать проблемы совместимости по-разному.
Дэвид Мейз
1
Это также объясняется в образе README (со страницы образа Docker Hub ).
Дэвид Мейз

Ответы:

106

Для документации библиотеки докеров (цитата и ссылки ниже) вот краткое изложение:

  • openjdk:<version>

Фактическое изображение. Используйте его, если не уверены.

  • openjdk:<version>-buster, openjdk:<version>-stretchиopenjdk:<version>-jessie

buster, jessieили stretchявляются кодовыми названиями пакетов для выпусков Debian и указывают, на каком выпуске основан образ.

  • openjdk:<version>-alpine

Точно так же этот образ основан на Alpine Linux , поэтому является очень маленьким базовым образом. Рекомендуется, если вам нужен размер изображения как можно меньше. Предостережение в том, что он использует некоторые необычные библиотеки, но не должно быть проблемой для большинства программ. Если сомневаетесь, проверьте официальную документацию ниже.

  • openjdk:<version>(с 12 лет), openjdk:<version>-oracleиopenjdk:<version>-oraclelinux7

Начиная с openjdk:12изображением по умолчанию, а также -oracleи -oraclelinux7варианты основаны на официальном Oracle Linux 7 образа . В OpenJDK двоичные файлы в изображения по умолчанию, а также -oracleи -oraclelinux7варианты построены Oracle и получены из сообщества OpenJDK .

  • openjdk:<version>-slim

Этот образ содержит только минимальные пакеты, необходимые для запуска Java (например, отсутствуют многие библиотеки Java, связанные с пользовательским интерфейсом). Если вы не работаете в среде , где толькоopenjdk будет развернут образ и у вас есть космические ограничения, изображение по умолчанию рекомендуется над этим.

  • openjdk:<version>-windowsservercore

Этот образ основан на Windows Server Core ( microsoft/windowsservercore) .



Полная документация ( версия показана ниже , последняя версия здесь ):

Варианты изображения

Эти openjdkобразы бывают разных вкусов, каждый из которых предназначен для использования конкретного случая.

openjdk:<version>

Это фактическое изображение. Если вы не уверены в своих потребностях, вы, вероятно, захотите использовать этот. Он предназначен для использования как в качестве выбрасываемого контейнера (смонтируйте исходный код и запустите контейнер для запуска приложения), так и в качестве основы для создания других образов.

У некоторых из этих тегов могут быть имена вроде jessie или stretch. Это кодовые названия пакетов для выпусков Debian, указывающие, на каком выпуске основан образ.

openjdk:<version>-alpine

Это изображение основано на популярном проекте Alpine Linux , доступных в на alpineофициальном изображении . Alpine Linux намного меньше, чем большинство базовых образов дистрибутивов (~ 5 МБ), и поэтому в целом образы намного тоньше.

Этот вариант настоятельно рекомендуется, когда требуется как можно меньший размер конечного изображения. Главное предостережение, которое следует отметить, заключается в том, что он использует musl libc вместо glibc и друзей , поэтому определенное программное обеспечение может столкнуться с проблемами в зависимости от глубины их требований к libc. Однако у большинства программ с этим нет проблем, поэтому этот вариант обычно является очень безопасным выбором. См. Эту ветку комментариев Hacker News для более подробного обсуждения проблем, которые могут возникнуть, и некоторых сравнений за / против использования изображений на основе Alpine.

Чтобы минимизировать размер изображения, в образы на базе Alpine редко включаются дополнительные связанные инструменты (например, gitили bash). Используя этот образ в качестве основы, добавьте то, что вам нужно, в свой собственный Dockerfile (см. alpineОписание образа для примеров того, как устанавливать пакеты, если вы не знакомы).

openjdk:<version>-windowsservercore

Этот образ основан на Windows Server Core ( microsoft/windowsservercore) . Таким образом, он работает только в тех местах, где работает этот образ, например в Windows 10 Professional / Enterprise (Anniversary Edition) или Windows Server 2016.

Для получения информации о том, как запустить Docker в Windows, обратитесь к соответствующему руководству Microsoft по быстрому запуску:

openjdk:<version>-slim

Этот образ устанавливает -headlessпакет OpenJDK, поэтому отсутствуют многие связанные с пользовательским интерфейсом библиотеки Java и некоторые общие пакеты, содержащиеся в теге по умолчанию. Он содержит только минимальные пакеты, необходимые для запуска Java. Если вы не работаете в среде , где толькоopenjdk будет развернут образ и у вас есть космические ограничения, мы настоятельно рекомендуем использовать изображение по умолчанию этого хранилища.

acdcjunior
источник
1

Выберите базовый образ докера, который соответствует вашим потребностям, и имейте в виду, что размер изображения также является важным аспектом .

Изображение можно рассматривать как набор инструкций по созданию контейнера. В Docker одно изображение может быть унаследовано от другого (или основано на нем) с добавлением дополнительных инструкций поверх базовых. Каждое изображение состоит из нескольких слоев, которые фактически неизменяемы.

Пожалуйста, прочтите статью " Создание идеального процесса сборки Java Docker" .

Размер образа Docker на самом деле очень важен. Размер влияет на:

  • сетевая задержка : необходимо передать образ Docker через Интернет
  • хранение : нужно где-то хранить все эти биты
  • доступность и эластичность сервиса : при использовании планировщика Docker, например Kubernetes, Swarm, Nomad, DC / OS или других (планировщик может перемещать контейнеры между хостами)
  • безопасность : действительно ли вам, я имею в виду, действительно нужен пакет libpng со всеми его уязвимостями CVE для вашего Java-приложения?
  • гибкость разработки : небольшие образы Docker == более быстрое время сборки и более быстрое развертывание


Для запуска Java-приложения вам понадобится как минимум JRE. Например, для весеннего проекта ваш образ может быть основан на 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"]

Также вы можете использовать, docker history yourImageNameчтобы увидеть все слои (и их размер), из которых состоит ваше изображение.

Гасем Садеги
источник