Использование Jib - контейнеровозов Java с открытым исходным кодом от Google.
К настоящему времени многие из нас использовали бы Docker для развертывания приложений / микросервисов Java. И почему бы и нет, в наши дни это де-факто становится стандартом для развертывания приложений.
Однако нужно правильно изучить и понять Docker, чтобы применять лучшие практики. Многие из нас теряются в сложностях Dockerfile.
В этой статье я собираюсь рассказать об очень крутом проекте с открытым исходным кодом, который позволяет нам создавать и развертывать докеризированные Java-приложения, используя простые сборки Maven / Gradle.
Типичный процесс докеризации Java-приложений
Если вы разработчик Java и хотите докеризовать свое приложение, вы, как правило, выполните следующие действия:
- Создайте толстую банку, используя сборку Maven / Gradle.
- Напишите Dockerfile.
- Создайте образ из файла Docker.
- Отправьте образ в реестр контейнеров.
Как разработчик Java, шаг 1 довольно прост, но когда дело доходит до следующих шагов, большинство из нас полагается на контент, доступный в Интернете. Типичный Dockerfile может выглядеть так, как показано ниже:
FROM open-jdk:8-jdk-alpine COPY target/myapp-*.jar /app.jar ENTRYPOINT java -jar /app.jar
Если я использую этот Dockerfile, я смогу создать образ Docker своего приложения и использовать его, но это может быть не самый эффективный образ, который я мог бы создать.
Если я буду искать больше в Интернете, я, возможно, смогу улучшить Dockerfile, следуя лучшим практикам Dockerfile.
С указанным выше файлом Dockerfile возникают различные проблемы.
- Здесь используется базовый образ JDK вместо JRE. При запуске вашего приложения требуется JRE, а не JDK. Если мы изменим это, то сможем значительно уменьшить размер изображения. Размер образа JRE составляет примерно 55 МБ, тогда как размер образа JDK - 192 МБ.
- Приложение построено с использованием толстой банки, что означает, что для этого приложения будет создан только один слой в образе Docker. Если мы вносим какие-либо изменения, то каждый раз, когда мы нажимаем весь уровень приложения, его нужно перестраивать. Мы можем улучшить это, разделив зависимости и код приложения на разные уровни. Разделить зависимости можно с помощью следующей команды maven:
mvn dependency:copy-dependencies -DoutputDirector=target/dependencies
.
Итак, после улучшения Dockerfile будет выглядеть, как показано ниже:
FROM open-jdk:8-jre-alpine COPY target/dependencies /app/dependencies COPY target/resources /app/resources COPY target/classes /app/classes ENTRYPOINT java -cp /app/dependencies/*:/app/resources/:/app/classes hello.Application
Введение в Jib
Jib - это контейнерный Java-контейнер с открытым исходным кодом от Google, который позволяет разработчикам создавать Docker-образы своих Java-приложений из сборок Maven / Gradle.
Как видно выше, создание образа Docker - сложный процесс, если вы не знакомы с лучшими практиками. Jib пытается решить эту проблему, но предоставляет плагин для сборки Maven и Gradle.
Итак, если вам нужно создать Docker-образ Java-приложения, вам просто нужно сделать две вещи.
- Добавьте зависимость Maven в
pom.xml
.
<plugin> <groupId>com.google.cloud.tools</groupId> <artifactId>jib-maven-plugin</artifactId> <version>1.8.0</version> <configuration> <to> <image><path-to-container-registry>/hello-jib</image> </to> </configuration> </plugin>
2. Выполните следующую команду:
mvn compile jib:build
Это приведет к внутреннему применению лучших практик Docker, разделит ваше приложение на несколько уровней, построит образ и отправит его в репозиторий контейнера.
Преимущества Jib
Использование Jib дает различные преимущества.
- Как Java-разработчику все, что мне нужно сделать, это сосредоточиться на Java и не беспокоиться о сложностях Docker.
- Поскольку это часть сборок Maven / Gradle, внедрение и развертывание происходит быстро.
- Поскольку Jib использует лучшие практики Docker, создаваемые образы бывают легкими, стандартными и многоуровневыми.
- Вам не нужен демон Docker для создания и отправки образов Docker.
Докер против Джиба
Вот некоторые результаты прямого сравнения двух методов.