Рубрики
Без рубрики

Создание образов Docker с помощью Spring Boot

Узнайте, как создавать образы Docker для приложения Spring Boot

Автор оригинала: Michael Pratt.

1. введение

По мере того как все больше организаций переходят к контейнерам и виртуальным серверам, Docker становится все более важной частью рабочих процессов разработки программного обеспечения. С этой целью одной из замечательных новых функций Spring Boot 2.3 является возможность легко создавать образ Docker для приложений Spring Boot.

В этом уроке мы рассмотрим, как создать образы Docker для приложения Spring Boot.

2. Традиционные сборки Докеров

Традиционный способ создания образов Docker с помощью Spring Boot – использовать файл Dockerfile. Ниже приведен простой пример:

FROM openjdk:8-jdk-alpine
EXPOSE 8080
ARG JAR_FILE=target/demo-app-1.0.0.jar
ADD ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

Затем мы могли бы использовать команду docker build для создания образа Docker. Это прекрасно работает для большинства приложений, но есть несколько недостатков.

Во-первых, мы используем жирную банку, созданную Spring Boot. Это может повлиять на время запуска, особенно в контейнерной среде . Мы можем сэкономить время запуска, добавив вместо этого разнесенное содержимое файла jar.

Во-вторых, изображения Docker строятся слоями. Природа Spring Boot fat jars приводит к тому, что весь код приложения и сторонние библиотеки помещаются в один слой. Это означает, что даже если изменяется только одна строка кода, весь слой должен быть перестроен .

Взрывая банку перед сборкой, код приложения и сторонние библиотеки получают каждый свой собственный слой. Это позволяет нам воспользоваться механизмом кэширования Docker. Теперь, когда изменяется одна строка кода, необходимо перестроить только соответствующий слой.

Имея это в виду, давайте посмотрим, как Spring Boot улучшил процесс создания образов Docker.

3. Строительные пакеты

Buildpacks-это инструмент, который предоставляет зависимости от фреймворка и приложения .

Например, при наличии Spring Boot fat jar пакет сборки предоставит нам среду выполнения Java. Это позволяет нам пропустить файл Docker и автоматически получить разумное изображение Docker.

Spring Boot включает в себя поддержку Maven и Gradle для пакетов сборки. Например, при построении с помощью Maven мы запустили бы команду:

./mvnw spring-boot:build-image

Давайте посмотрим на некоторые соответствующие результаты, чтобы увидеть, что происходит:

[INFO] Building jar: target/demo-0.0.1-SNAPSHOT.jar
...
[INFO] Building image 'docker.io/library/demo:0.0.1-SNAPSHOT'
...
[INFO]  > Pulling builder image 'gcr.io/paketo-buildpacks/builder:base-platform-api-0.3' 100%
...
[INFO]     [creator]     ===> DETECTING
[INFO]     [creator]     5 of 15 buildpacks participating
[INFO]     [creator]     paketo-buildpacks/bellsoft-liberica 2.8.1
[INFO]     [creator]     paketo-buildpacks/executable-jar    1.2.8
[INFO]     [creator]     paketo-buildpacks/apache-tomcat     1.3.1
[INFO]     [creator]     paketo-buildpacks/dist-zip          1.3.6
[INFO]     [creator]     paketo-buildpacks/spring-boot       1.9.1
...
[INFO] Successfully built image 'docker.io/library/demo:0.0.1-SNAPSHOT'
[INFO] Total time:  44.796 s

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

В следующей строке начинается построение образа Docker. Сразу после этого мы видим, как сборка тянет Пакет builder.

Пакет-это реализация облачных пакетов сборки. Он выполняет работу по анализу нашего проекта и определению необходимых фреймворков и библиотек . В нашем случае он определяет, что у нас есть проект Spring Boot, и добавляет необходимые пакеты сборки.

Наконец, мы видим сгенерированный образ докера и общее время сборки. Обратите внимание, как в первый раз, когда мы строим, мы тратим довольно много времени на загрузку пакетов сборки и создание различных слоев.

Одной из замечательных особенностей buildpacks является то, что изображение Docker состоит из нескольких слоев. Поэтому, если мы изменим только код нашего приложения, последующие сборки будут намного быстрее:

...
[INFO]     [creator]     Reusing layer 'paketo-buildpacks/executable-jar:class-path'
[INFO]     [creator]     Reusing layer 'paketo-buildpacks/spring-boot:web-application-type'
...
[INFO] Successfully built image 'docker.io/library/demo:0.0.1-SNAPSHOT'
...
[INFO] Total time:  10.591 s

4. Многослойные банки

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

По этим причинам Spring Boot также поддерживает создание образов Docker с использованием многослойных банок . Чтобы понять, как это работает, давайте рассмотрим типичный макет Spring Boot fat jar:

org/
  springframework/
    boot/
  loader/
...
BOOT-INF/
  classes/
...
lib/
...

Жирная банка состоит из 3 основных областей:

  • Классы начальной загрузки, необходимые для запуска приложения Spring
  • Код приложения
  • сторонние библиотеки

С многослойными банками структура выглядит аналогично, но мы получаем новый файл layers.idx , который сопоставляет каждый каталог в fat jar со слоем:

- "dependencies":
  - "BOOT-INF/lib/"
- "spring-boot-loader":
  - "org/"
- "snapshot-dependencies":
- "application":
  - "BOOT-INF/classes/"
  - "BOOT-INF/classpath.idx"
  - "BOOT-INF/layers.idx"
  - "META-INF/"

Из коробки пружинный ботинок обеспечивает четыре слоя:

  • зависимости : типичные зависимости от третьих сторон
  • snapshot-зависимости : зависимости от моментальных снимков от третьих сторон
  • ресурсы : статические ресурсы
  • приложение : код приложения и ресурсы

Цель состоит в том, чтобы поместить код приложения и сторонние библиотеки в слои, которые отражают, как часто они меняются .

Например, код приложения, скорее всего, меняется чаще всего, поэтому он получает свой собственный слой. Кроме того, каждый слой может развиваться самостоятельно, и только после изменения слоя он будет перестроен для образа Docker.

Теперь, когда мы понимаем новую многоуровневую структуру jar, давайте посмотрим, как мы можем использовать ее для создания изображений Docker.

4.1. Создание многослойных банок

Во-первых, мы должны настроить наш проект для создания многослойной банки. С Maven это означает добавление новой конфигурации в раздел плагинов Spring Boot нашего POM:


    org.springframework.boot
    spring-boot-maven-plugin
    
        
            true
        
    

При такой конфигурации команда Maven package (вместе с любой из ее зависимых команд) создаст новый многоуровневый jar, используя четыре слоя по умолчанию, упомянутых ранее.

4.2. Просмотр и извлечение слоев

Затем нам нужно извлечь слои из банки, чтобы изображение Docker имело соответствующие слои.

Чтобы изучить слои любой многослойной банки, мы можем выполнить команду:

java -Djarmode=layertools -jar demo-0.0.1.jar list

Затем, чтобы извлечь их, мы бы побежали:

java -Djarmode=layertools -jar demo-0.0.1.jar extract

4.3. Создание образа Docker

Самый простой способ включить эти слои в изображение Docker-это использовать файл Dockerfile:

FROM adoptopenjdk:11-jre-hotspot as builder
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} application.jar
RUN java -Djarmode=layertools -jar application.jar extract

FROM adoptopenjdk:11-jre-hotspot
COPY --from=builder dependencies/ ./
COPY --from=builder snapshot-dependencies/ ./
COPY --from=builder spring-boot-loader/ ./
COPY --from=builder application/ ./
ENTRYPOINT ["java", "org.springframework.boot.loader.JarLauncher"]

Этот файл Dockerfile извлекает слои из нашей толстой банки, а затем копирует каждый слой в изображение Docker. Каждая директива COPY приводит к созданию нового слоя в конечном образе Docker .

Если мы создадим этот файл Dockerfile, мы увидим, что каждый слой из многослойной банки добавляется к изображению Docker как собственный слой:

...
Step 6/10 : COPY --from=builder dependencies/ ./
 ---> 2c631b8f9993
Step 7/10 : COPY --from=builder snapshot-dependencies/ ./
 ---> 26e8ceb86b7d
Step 8/10 : COPY --from=builder spring-boot-loader/ ./
 ---> 6dd9eaddad7f
Step 9/10 : COPY --from=builder application/ ./
 ---> dc80cc00a655
...

5. Заключение

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

Все примеры в этом учебнике можно найти на GitHub .

Для получения дополнительной информации об использовании Java и Docker ознакомьтесь с руководством по кливеру .