Мой первый пост… ура!
Как говорится: хорошие вещи приходят в маленьких упаковках. Для образов контейнеров это означает меньшую поверхность атаки и более быстрое развертывание и запуск. К сожалению, Java не была лучшим кандидатом для контейнеризации, но это изменилось с несколькими интересными разработками:
- JEP 386: Порт Alpine для Linux : Были и другие сборки Alpine различного качества, но теперь это официально,
- JPG 282: j ссылка: Компоновщик Java : Использование системы модулей для создания сборок только с теми битами, которые вы используете,
- Собственное изображение Грааля : Статически связанный образ Java.
С Java 16 мы теперь можем использовать Jlink с изображениями Alpine, чтобы получить все GCS следующего поколения (a-la ZGC и Шенандоа).
Я подумал, что было бы полезно сравнить и сопоставить их с простым сервисом отдыха. Для этого я использую io.helidon.archetypes: helidon-quickstart-mp:2.2.0
архетип в качестве основы с некоторыми настройками в файле Dockerfile
s.
ℹ️ Это реализация микропрофиля, так что это означает полнофункциональный CDI, JAX-RS, который IMHO обеспечивает хороший компромисс между стандартами, производительностью разработчиков и масштабируемостью.
В файлах требовались некоторые изменения.
Для Докер-файла
:
-FROM openjdk:11-jre-slim +FROM openjdk:16-jdk-alpine
Для Докерфайла.jlink
:
-FROM maven:3.6.3-jdk-11-slim as build +FROM openjdk:16-jdk-alpine as build +RUN apk add --no-cache bash maven -FROM debian:stretch-slim +FROM alpine:3.13.0 +RUN apk add --no-cache bash
ℹ️ Мы должны добавить bash
к изображению Alpine Link, которое добавляет 2 МБ, так как Helidon использует небольшой скрипт для запуска. В идеале, если бы я занимался этим, я бы стремился устранить эту зависимость.
Итак, как выглядят размеры изображений с использованием изображения Slim JDK в качестве элемента управления:
220 МБ | JDK 11 Тонкий (Debian) | 100% |
338 МБ | Альпийский | 154% |
127 МБ | Альпийский JLink | 58% |
94 МБ | Собственное изображение Грааля | 43% |
Как и ожидалось, Graal на основе царапины
изображение очень маленькое, за ним следует Alpine JLink, тонкий и, наконец, Alpine сзади. Теперь время запуска:
4,493 мс | JDK 11 Тонкий (Debian) | 100% |
3,310 мс | Альпийский | 74% |
1,844 мс | Альпийский JLink | 41% |
80 мс | Собственное изображение Грааля | 2% |
Опять же, здесь не так много сюрпризов, кроме того, что Грааль быстрее, чем я думал!
Это очень интересное время для Java и контейнеров. Java может быть компактной, легкой и быстрой , что по-прежнему делает ее актуальной в собственном развертывании контейнера.
Как у JLink ( gRPC#3522 ), так и у Grohl есть некоторые проблемы; Я особенно обеспокоен серийным GC в Граале, поэтому скоро подвергну это некоторому стрессу, чтобы посмотреть, подтвердит ли это мои подозрения. Я также буду хорош, когда появятся некоторые изображения Java 16 JRE Alpine, так как JDK слишком раздут.
Жюри не знает, является ли Graal или Jlink моим предпочтительным подходом, пока я не смогу загрузить их и посмотреть, как они ведут себя в Kubernetes, но все выглядит хорошо.
Оригинал: “https://dev.to/dansiviter/java-16-ea-alpine-jlink-vs-graal-243d”