Как докернизировать приложение весенней загрузки с помощью Jib от Google

Изображение 1: Изображения Java Docker без трения с помощью Jib!

Здравствуйте! Работая недавно над платформой на основе пружины, я думал о том, каким путем можно докернизировать микросервис. Так что я наткнулся на Jib, довольно новый подход к этому вопросу, разработанный Google.

Этот пост посвящен использованию Jib, а точнее jib-maven-plugin, для создания контейнерного приложения для весенней загрузки.

Демонстрационный проект, используемый в этом посте, можно найти здесь:

Что такое кливер

Jib приносит в таблицу то, что он позволяет вам создавать контейнер, просто добавляя плагин к выбранному вами средству сборки (Maven или Gradle). Никаких дополнительных файлов, всего несколько строк конфигурации, и он обрабатывает все этапы упаковки вашего приложения в образ контейнера.

Собственными словами команды Google Cloud:

Jib - это Java-контейнеризатор с открытым исходным кодом от Google, который позволяет разработчикам Java создавать контейнеры с использованием известных им инструментов Java. Он не требует написания Dockerfile или наличия установленного докера, и он напрямую интегрирован в Maven и Gradle.

В «традиционном» потоке сборки образов Java для Docker нам нужны Dockerfile и установленный демон docker, как показано ниже:

Изображение 2. Традиционные шаги по созданию образа Docker из приложения Java.

Как видно из диаграммы, в потоке сборки Jib вам просто нужен плагин для файла сборки проекта:

Изображение 3: способ Jib для создания образа докера из приложения Java.

Настроить

Целью этого поста не является настройка среды разработки Java, но давайте попробуем!

  1. Убедитесь, что у вас установлена ​​Java 8+.
  2. Мы будем использовать maven, поэтому, если его нет, установите maven 3.5+.
  3. Убедитесь, что у вас установлен докер, и если вы используете Linux, у вашего пользователя есть доступ к докеру.
  4. Установите ваш любимый IDE (затмение или идея).

Создать базовое приложение для весенней загрузки

Это можно сделать либо через spring initializr, либо через вашу любимую IDE. Если вы использовали весенний инициализатор, вам нужно будет импортировать недавно созданный проект maven в вашу IDE (eclipse / idea).

Добавьте jib-maven-plugin в ваш pom.xml

Для очень простого локально сохраненного образа вашего приложения настройте jib-maven-plugin в вашем pom.xml следующим образом:

Скомпилируйте приложение и создайте образ

Теперь мы можем собрать приложение и проверить, создан ли образ в нашем локальном хранилище докеров.

Перейдите в корневую папку проекта через терминал и выполните:

mvn скомпилирует jib: dockerBuild

Журналы сборки Maven должны содержать такие строки:

[INFO] - jib-maven-plugin: 0.10.1: dockerBuild (default-cli) @ spring-boot-jib - -
[ИНФОРМАЦИЯ]
[INFO] Контейнерное приложение для демона Docker в виде springbootjib…
[ПРЕДУПРЕЖДЕНИЕ] Базовое изображение ‘gcr.io/distroless/java’ не использует определенный дайджест изображения - сборка может не воспроизводиться
[INFO] Получение базового изображения gcr.io/distroless/java…
[INFO] Слой построения зависимостей…
[INFO] Уровень строительных ресурсов…
[INFO] Создание слоя классов ...
[INFO] Завершение ...
[ИНФОРМАЦИЯ]
[INFO] Точка входа контейнера, установленная в [java, -cp, / app / resources: / app / classes: / app / libs / *, com.jibdemo.SpringBootJibApplication]
[INFO] Загрузка в демон Docker…
[ИНФОРМАЦИЯ]
[INFO] Встроенный образ для демона Docker в виде springbootjib

До тех пор, пока ошибок нет и мы видим, что maven «Построен образ для демона Docker как springbootjib» у нас все готово.

Запустите образ докера

На этом этапе у нас должен быть новый образ докера в нашем локальном репозитории. Мы можем проверить, выполнив команду docker image ls, и мы должны увидеть изображение, подобное этому

springbootjib последнее eb4bea693650 3 часов назад 135MB

Обратите внимание на очень маленький (135 МБ) размер изображения, что связано с изображением gcr.io/distroless/java, которое Jib использует по умолчанию (позже мы увидим, как это можно изменить).

Теперь мы можем запустить образ как обычно, набрав команду docker run -it springbootjib и убедившись, что приложение работает должным образом.

Настройка Jib-плагина для точной настройки нашего образа Docker

Мы можем копать глубже и настраивать плагин Jib дальше, чтобы он соответствовал нескольким распространенным сценариям, таким как вход в репозиторий Docker, отображение портов, выбор конкретного базового образа и т. Д.

Например, в следующей конфигурации изображение:

  • Построен из базы openjdk: alpine (вытащенный из Docker Hub)
  • Отправляется на локальный хост: 5000 / springbootjib: 0.0.1-SNAPSHOT, локальный хост: 5000 / springbootjib: alpine и локальный хост: 5000 / springbootjib: последний
  • Запускается путем вызова java -Xms256m -Xdebug -cp app / libs / *: app / resources: app / classes com.jibdemo.SpringBootJibApplication некоторые аргументы
  • Предоставляет порт 8001 для TCP (по умолчанию) и порты 8002 и 8003 для UDP
  • Имеет ярлык (название: springbootjib)
  • Построен в формате OCI

Теперь вы можете снова создать образ и увидеть разницу в журналах Maven:

[INFO] --- jib-maven-plugin: 0.10.1: dockerBuild (default-cli) @ spring-boot-jib ---
[ИНФОРМАЦИЯ]
[INFO] Контейнерное приложение для демона Docker как localhost: 5000 / springbootjib: 0.0.1-SNAPSHOT, localhost: 5000 / springbootjib: alpine, localhost: 5000 / springbootjib ...
[INFO] Получение базового изображения openjdk: alpine ...
[INFO] Слой построения зависимостей ...
[INFO] Уровень строительных ресурсов ...
[INFO] Создание слоя классов ...
[INFO] Базовое изображение требует авторизации. Попытка еще раз для openjdk: alpine ...
[INFO] Получение учетных данных реестра для registry.hub.docker.com ...
[INFO] Завершение ...
[ИНФОРМАЦИЯ]
[INFO] Точка входа контейнера, установленная в [java, -Xms256m, -Xdebug, -cp, / app / resources: / app / classes: / app / libs / *, com.jibdemo.SpringBootJibApplication]
[INFO] Загрузка в демон Docker ...
[ИНФОРМАЦИЯ]
[INFO] Встроенный образ для демона Docker как localhost: 5000 / springbootjib: 0.0.1-SNAPSHOT, localhost: 5000 / springbootjib: alpine, localhost: 5000 / springbootjib

Обратите внимание на сегмент журнала выше, что плагин вытащил образ openjdk: alpine из Docker Hub, собрал изображение в три версии с разными тегами и сохранил их в нашем локальном репозитории.

Почему я сделал укол

  • Вам не нужно поддерживать Dockerfile, запускать Docker-демон или даже беспокоиться о создании толстого JAR-файла со всеми его зависимостями.
  • Использует преимущества многоуровневого формирования изображений и кэширования реестра для быстрой и последовательной сборки.
  • Может быть настроен на создание воспроизводимых образов сборки, если ваши входные данные остаются неизменными.

Вывод

Воспользовавшись другими плагинами Maven, такими как Spotify и Fabric8, для создания образов Docker для Java-приложений, я приветствую решение Google по этому вопросу. Он требует меньше файлов, чем плагин fabric8, и (по моему скромному мнению) его легче настроить, чем плагин spotify. Я, конечно, рекомендую попробовать!

Отказ от ответственности: это не статья для сравнения, просто моя точка зрения по этому вопросу, основанная на личном опыте.

Вы всегда можете прочитать больше о репозитории Gibub Gibub, в котором есть полная информация обо всех параметрах конфигурации. Спасибо за чтение этого далеко! Я надеюсь, что вам понравилось! Не стесняйтесь оставить свой отзыв здесь.

Обо мне

Эй, спасибо, что заглянули. Я - независимый инженер полного стека, подчеркиваю в бэкэнде и devOps. Я заинтересован в создании прототипов / MVP и разработке платформ, которые масштабируются в облаке, с целью создания ценности для бизнеса.

Вы можете прочитать больше обо мне и моей истории здесь. Если вы хотите обсудить бизнес или просто связаться с нами, пришлите мне электронное письмо: tasos.tsaousis@codedlines.com.