Как упаковать java приложение в docker
Что я хочу сделать, это создать образ докеров для моего Java-приложения, но для большинства скомпилированных языков должны быть верны следующие соображения.
На моем сервере сборки я хочу создать образ докеры для моего приложения в качестве поставляемого. Для этого мне нужно скомпилировать приложение с помощью некоторого инструмента сборки (обычно Gradle, Maven или Ant), а затем добавить созданный файл JAR в образ докеры. Поскольку я хочу, чтобы изображение докера просто выполняло JAR файл, я, конечно же, начну с базового образа с уже установленной Java.
Пусть инструмент сборки управляет процессом
В этом случае мой инструмент построения управляет всем процессом. Поэтому он готовит JAR файл, и после создания JAR он вызывает Docker для создания изображения. Это работает, поскольку JAR создается заранее, и Docker может не обращать внимания на процесс сборки, необходимый для создания JAR.
Но мой Dockerfile больше не является автономным. Это зависит от шагов, которые могут произойти за пределами Docker. В моем Dockerfile у меня будет оператор COPY или ADD , который должен скопировать JAR файл на изображение. Это утверждение не будет выполнено, если баннер не будет создан заранее. Так что просто выполнение Dockerfile может не работать. Это становится проблемой, если вы хотите интегрироваться с сервисами, которые только что создаются с использованием текущего файла Docker, например, функции автоматической сборки на DockerHub.
пусть Docker управляет сборкой
В этом случае все необходимые шаги для создания изображения добавляются в файл Docker, поэтому изображение можно создать, просто выполнив сборку Docker.
Основная проблема с этим подходом заключается в том, что нельзя добавлять команды Dockerfile, которые должны выполняться за пределами создаваемого образа докера. Это означает, что я должен добавить свой исходный код и свои инструменты сборки к образцу докеров и создать свой JAR файл внутри изображения. Это приведет к тому, что мое изображение будет больше, чем должно быть из-за всех добавленных файлов, которые будут лишними во время выполнения. Это также добавит дополнительные слои к моему изображению.
Как заметил @adrian-mouat, если бы я добавил источники, создав приложение и удалив исходные файлы в одном заявлении RUN, я мог бы избежать добавления ненужных файлов и слоев в образ Docker. Это означало бы создание какой-то безумной цепной команды.
две отдельные сборки
В этом случае мы разделим нашу сборку на две части: сначала мы создаем файл JAR с помощью нашего инструмента сборки и загружаем его в репозиторий (репозиторий Maven или Ivy). Затем мы запускаем отдельную сборку Docker, которая просто добавляет JAR файл из репозитория.
На мой взгляд, лучший способ - позволить инструменту сборки управлять процессом. Это приведет к чистому снимку докера и, поскольку изображение - это то, что мы хотим доставить, имеет большое значение. Во избежание наличия потенциально не работающего файла Docker, лежащего вокруг него, необходимо создать часть сборки. Поэтому никто не случайно использовал его, чтобы начать разбитую сборку.
Но это не позволит мне интегрироваться с DockerHub.
Есть ли другой способ, который мне не хватает?
ОТВЕТЫ
Ответ 1
Концентратор реестра Docker содержит образ Maven, который можно использовать для создания контейнеров Java.
При таком подходе на машине сборки не требуется предварительно устанавливать Java или Maven, Docker контролирует весь процесс сборки.
Изображение построено следующим образом:
И выполните следующее:
Dockerfile
Если вы хотите оптимизировать изображение, чтобы исключить источник, вы можете создать Dockerfile, который включает только встроенный файл jar:
И создайте изображение в два этапа:
Обновление (2017-07-27)
Docker теперь имеет возможность многоэтапной сборки. Это позволяет Docker создавать образ, содержащий инструменты сборки, но только зависимости времени выполнения.
В следующем примере демонстрируется эта концепция, обратите внимание, как jar копируется из целевого каталога первого этапа сборки
Ответ 2
Структура java-приложения
Содержимое файла Docker
Убедитесь, что контейнер запущен или нет
Ответ 3
Самый простой способ - позволить инструменту сборки контролировать процесс. В противном случае вам потребуется сохранить файл сборки инструмента сборки (например, pom.xml для Maven или build.gradle для Gradle), а также Dockerfile .
Простой способ создать Docker-контейнер для вашего Java-приложения - это использовать Jib, который доступен в виде плагинов Maven и Gradle.
Например, если вы используете Maven и хотите собрать свой контейнер для работающего демона Docker, вы можете просто запустить эту команду:
Кроме того, можно построить непосредственно в реестр Докер с стакселя без необходимости установки docker , запустите демон Docker (который требует привилегий суперпользователя), или написать Dockerfile . Это также быстрее и воспроизводит изображения.
Ответ 4
Мы использовали Spotify Docker Maven Plugin некоторое время. Плагин позволяет вам привязать Docker к его фазе жизненного цикла Maven.
Пример: Запустите сборку Docker после упаковки (фаза: пакет) вашего приложения, настроив плагин, чтобы добавить ваше встроенное приложение в качестве ресурса в контекст сборки Docker. На этапе развертывания нажмите кнопку Docker push to push to Docker в реестре. Это может работать рядом с обычным плагином развертывания, который публикует артефакт в хранилище, например Nexus.
Позже мы разделили сборку на два отдельных задания на сервере CI. Поскольку Docker - это всего лишь один способ запуска вашего приложения (иногда нам нужно, чтобы выпущенное приложение использовалось в разных средах не только Docker), сборка Maven не должна полагаться на Docker.
Итак, первое задание освобождает приложение в Nexus (через развертывание Maven). Второе задание (которое может быть нисходящей зависимостью первого задания) загружает последний артефакт выпуска, выполняет сборку Docker и помещает изображение в реестр. Для загрузки последней версии мы используем Версии Maven Plugin (версии: use-latest-релизы), а также Maven Dependency Plugin (зависимость: get и зависимость: копирование).
Второе задание также может быть запущено для конкретной версии приложения для (re) создания образа Docker для более старой версии. Кроме того, вы можете использовать конвейер сборки (на Jenkins), который выполняет оба задания и передает версию выпуска или артефакт выпуска в сборку Docker.
Ответ 5
Я не вижу проблемы с двумя отдельными Dockerfiles. Самое приятное в том, что вы можете использовать JRE, а не JDK, чтобы разместить свою банку.
Ответ 6
существуют альтернативные способы использования банковых или военных пакетов
- добавить jar в изображение.
- установить heapsize для java
- выполнить команду jar через точку входа
образец файла dockerfile
пример развертывания пакета на tomcat
Создание докеров в качестве изображения
Использовать изображение для создания контейнера
Ответ 7
Здесь Я описываю, как я это делаю в своей среде разработки.
- Создайте войну/банку локально с помощью Maven
- Скопируйте его в локальную папку Docker
- Запустите Плагин Intellij Docker, который создает изображение докера, содержащее войну/банку, запускает сервер приложений и разворачивает его на удаленном докере сервер
Надеюсь, что это поможет.
Ответ 8
Контейнерное Java-приложение с использованием инструмента Jib без написания dockerfile
Jib - это инструмент Java с открытым исходным кодом, поддерживаемый Google для создания образов Docker приложений Java. Это упрощает контейнеризацию, так как с ней нам не нужно писать dockerfile. И на самом деле нам даже не нужно устанавливать докер, чтобы самим создавать и публиковать образы докеров.
Сортируем ветки
- JRTB-0
- JRTB-2
- JRTB-3
- STEP_1_JRTB-0 — первый шаг
- STEP_2_JRTB-2 — второй шаг
- STEP_3_JRTB-3 — третий шаг
Немного о докере
Что такое Docker? Вкратце — это инструмент, с помощью которого можно быстро и безопасно развертывать (деплоить) приложения, создавая для них закрытую инфраструктуру, необходимую только для них. Пока что сложно, я понимаю. В общем и целом докер можно понимать как платформу для разработки, где можно быстро и эффективно работать. Докер можно понимать как программу, которая работает на сервере. Эта программа имеет возможность хранить контейнеры с приложениями. Что такое контейнер? Это отдельная инфраструктура, в которую можно добавить все, что нужно. Например для Java-приложения нам нужна JRE, чтобы запустить приложение, вот контейнер будет иметь это, нужно будет еще какое-то программное обеспечение — можно добавить это. А может быть, нам нужен Линукс и Tomcat сервлет контейнер. Такое тоже можно будет сделать. Контейнеры создаются на основе image (образа): то есть, это определенный шаблон в котором написано все необходимое для создания докер контейнера. Как создать этот образ? В нашем случае нам нужно будет создать файл Dockerfile в корне проекта с описанием того, что должно быть в контейнере. Так как мы не хотим где-то показывать токен бота, придется извернуться и передавать его каждый раз, когда мы захотим развертывать приложение. Более детально об этой теме почитать можно здесь и здесь.
Пишем JRTB-13
Нужно настроить быстрый и легкий процесс развертывания (деплоя) нашего приложения на сервер. То есть на машину, которая работает 24/7. За основу возьмем докер. Но задачи в нашем списке, которая бы отвечала за добавление этой функциональности, нет. Как-то я его пропустил при создании. Ничего страшного, сейчас создадим. Заходим на вкладку создания issue на гитхаб и выбираем Feature Request:Добавляем описание задачи, критерии его приемки, устанавливаем, к какому проекту этот issue относится и можно создавать новое issue:Теперь чтобы показать, что задача взята в работу, сменим статус задачи с To do на In Progress:Это будет сложная статья. Если будут проблемы — пишите в комментариях: я буду следить и отвечать на них в меру сил. Такой будет небольшой Customer Support :DСоздаем Dockerfile
Создаем docker-compose.yml
Хорошо бы вам про YAML формат почитать отдельно, а то статья и так уже растет, как на дрожжах. Для нас это просто еще одно описание переменных по типу .properties. Только в пропертях записывается через точку, а в YAML это делается немного красивее. Например, так. Две переменные в .properties: javarush.telegram.bot.name=ivan javarush.telegram.bot.token=pupkin А вот в .yaml (тоже самое что и .yml) будет это так: Второй вариант более красивый и понятный. Пробелы должны быть именно такие, как указаны выше. Как-нибудь переведем наши application.properties и application.yml. Для начала нужно его создать. В корне проекта создаем файл docker-compose.yml и записываем туда следующее: Первая строка — это версия docker-compose. services: говорит о том, что все следующие строки после этого (будут сдвинуты) — относятся к сервисам, которые мы настраиваем. У нас такой пока только один — java-приложение под названием jrtb . И уже под ним будут все его настройки. Например, build: context: . говорит о том, что мы будем искать Dockerfile в той же директории, что и docker-compose.yml. А вот секция environment: будет отвечать за то, чтобы мы передали в Dockerfile необходимые переменные среды (environment variables). Как раз то, что нам и нужно. Поэтому ниже мы переменные и передаем. Их docker-compose будет искать в переменных операционной среды сервера. Добавим их в баш скрипте.
Создаем баш скрипты
- Dockerfile — файл для создания образа нашего приложения;
- docker-compose.yml — файл с настройкой того, как мы будем запускать наши контейнеры;
- start.sh — баш скрипт для развертывания нашего приложения;
- stop.sh — баш скрипт для остановки нашего приложения.
И в README добавим новый параграф с описанием того, как деплоить наше приложение:
Разумеется, все пишет на английском. Уже как обычно, в нашей новосозданной ветке STEP_4_JRTB-13 создаем новый коммит с именем: JRTB-13: implement deployment process via docker и делаем пуш. Я перестаю подробно останавливаться на вещах, которые я уже описывал в прошлых статьях. Не вижу смысла повторять одно и тоже. К тому же, кто разобрался и сделал у себя, у того вопросов не возникнет. Это я о том, как создать новую ветку, как создать коммит, как запушить коммит в репозиторий.
В этом курсе мы предлагаем серию руководств, чтобы вы могли разрабатывать свои собственные приложения на основе Docker. Мы охватываем широкий спектр тем, от Docker через командную строку, до разработки, тестирования, развертывания и непрерывной интеграции. С нашими простыми учебными пособиями вы сможете запустить и запустить собственные проекты за минимальное время. Проверьте это здесь !
Содержание
1. Введение
В течение первых нескольких частей руководства мы рассмотрели основы Docker и множество способов взаимодействия с ним. Настало время применить полученные знания в реальных проектах Java, начав обсуждение с темы о том, как Docker влияет на хорошо отлаженные процессы и практики сборки.
Честно говоря, цель этого раздела двоякая. Сначала мы рассмотрим, как существующие инструменты сборки, а именно Apache Maven и Gradle , помогают упаковывать приложения Java в контейнеры Docker . Во-вторых, мы будем продвигать эту идею еще дальше и узнаем, как мы могли бы использовать Docker для полной инкапсуляции конвейера сборки наших Java-приложений и создания окончательных образов Docker в конце.
2. Под увеличительным стеклом
Чтобы поэкспериментировать, мы собираемся разработать два простых (но, тем не менее, значимых) веб-приложения на Java, которые бы реализовывали и представляли API REST (ful) для управления задачами.
Первое приложение будет разработано поверх Spring Boot и Spring Webflux с использованием Gradle в качестве инструмента управления сборкой и зависимостями. Что касается версий, мы будем использовать последнюю 2.0.0.M6 Spring Boot 2.0.0.M6 , последнюю 2.0.0.M6 Spring Webflux 5.0.1 и последнюю версию Gradle 4.3 .
Второе приложение, хотя и функционально эквивалентное первому, будет разработано поверх другой популярной платформы Java, Dropwizard , на этот раз с использованием Apache Maven для управления сборкой и зависимостями. Что касается версий, мы собираемся представить последний выпуск 1.2.0 Dropwizard и последний выпуск 3.5.2 Apache Maven .
Как мы уже упоминали, оба приложения будут реализовывать и предоставлять API-интерфейсы REST (ful) для управления задачами, по сути, заключая в себе операции CRUD (создание, чтение, обновление и удаление).
Сама задача моделируется как постоянный объект, который будет управляться Hibernate ORM и храниться в базе данных отношений MySQL .
@Column (name = "description" , nullable = true , columnDefinition = "TEXT" )На этом сходство обоих приложений заканчивается, и каждое из них будет следовать своему идиоматическому пути развития.
3. Градл и Докер
Итак, все готово, давайте начнем путешествие с изучения того, что нужно для интеграции Docker в типичную сборку Gradle . Для этого подраздела вам понадобится установить Gradle 4.3 на ваш компьютер для разработки. Если у вас его еще нет, следуйте инструкциям по установке , выбрав любой предложенный метод, который вы предпочитаете.
Чтобы упаковать типичное приложение Spring Boot как образ Docker с помощью Gradle, нам просто нужно включить два дополнительных плагина в файл build.gradle :
Конвейер сборки в основном полагался бы на плагин Spring Boot Gradle для создания uber-jar (термин, который часто используется для описания техники создания единственного исполняемого JAR-архива приложения), который позже будет использоваться Palantir Docker Gradle для сборки образа Docker . Вот как выглядит определение сборки, файл build.gradle .
classpath "org.springframework.boot:spring-boot-gradle-plugin:2.0.0.M6" compile( "org.springframework.boot:spring-boot-starter-webflux:2.0.0.M6" ) compile( "org.springframework.boot:spring-boot-starter-data-jpa:2.0.0.M6" ) compile( "org.springframework.boot:spring-boot-starter-actuator:2.0.0.M6" )Это на самом деле довольно просто, все мясо в основном находится в разделе build.gradle файла build.gradle . Вы также можете заметить, что мы используем наш собственный Dockerfile , src/main/docker/Dockerfile , чтобы предоставить Docker инструкции по созданию образа.
ENTRYPOINT exec java $JAVA_OPTS -Ddb.host=$DB_HOST -Ddb.port=$DB_PORT -jar /spring-boot-webapp .jarДействительно, так просто, как только можно. Обратите внимание, как мы используем инструкцию ARG (и настройку build.gradle файле build.gradle ) для передачи аргументов в изображение. В этом случае мы передаем версию проекта, чтобы найти окончательные артефакты сборки. Еще одна интересная деталь, на которую стоит обратить внимание, — это использование инструкций ENV для соединения хоста и порта экземпляра MySQL для подключения. И, как вы уже догадались, инструкция EXPOSE информирует Docker о том, что контейнер прослушивает порт 19900 во время выполнения.
Круто, а что дальше? Ну, нам просто нужно запустить нашу сборку Gradle , вот так:
Задача dockerTag самом деле не нужна, но из-за этой проблемы, о которой сообщалось в отношении плагина Palantir Docker Gradle, мы должны явно вызвать его, чтобы правильно dockerTag наше изображение. Давайте проверим, есть ли у нас изображение, доступное локально.
jcg /spring-boot-webapp 0.0.1-SNAPSHOT 65057c7ae9ba 21 seconds ago 133MB jcg /spring-boot-webapp latest 65057c7ae9ba 21 seconds ago 133MBХорошо, новый образ есть прямо из духовки. Мы можем запустить его немедленно, используя инструмент командной строки docker , но сначала нам нужно, чтобы где-то был доступен контейнер MySQL . К счастью, мы делали это уже столько раз, что это нас не озадачит.
Теперь мы готовы запустить наше приложение в виде контейнера Docker . Есть несколько способов, которыми мы могли бы ссылаться на контейнер MySQL , при этом определяемая пользователем сеть является предпочтительным вариантом. Для простых случаев, подобных нашему, мы можем просто обратиться к нему, назначив DB_HOST среды DB_HOST IP-адрес работающего контейнера MySQL , например:
Сопоставив порт 19900 от контейнера к хосту, мы могли общаться с нашим приложением, получая доступ к его REST (ful) API из curl, используя localhost качестве имени хоста. Давайте сделаем это прямо сейчас.
Под капотом много движущихся частей, например, автоматическая миграция базы данных с использованием Flyway и встроенная поддержка проверки работоспособности с помощью Spring Boot Actuator . Некоторые из них появятся в следующих разделах руководства, но посмотрите, насколько просто и естественно создать и упаковать свои приложения Spring Boot в виде образов Docker с помощью Gradle .
4. Gradle на докере
Оказывается, что создание образов Docker с помощью Gradle совсем не больно. Но все же, для того, чтобы Gradle был установлен в целевой системе вместе с JDK / JRE, требуется некоторая предварительная работа. Это может быть не проблема, скажем, для разработки, так как очень вероятно, что вы все равно (и многие другие) были бы установлены.
Однако в случае облачных развертываний или конвейеров CI / CD это может быть проблемой, что может повлечь за собой дополнительные затраты с точки зрения работы и / или обслуживания. Можем ли мы найти способ избавиться от таких издержек и полностью положиться на Docker ? Да, фактически мы можем, приняв многоэтапные сборки , одно из недавних дополнений в наборе функций Docker .
Если вам интересно, как это может помочь нам, вот идея. По сути, мы собираемся следовать обычной процедуре создания образа из Dockerfile . Но Dockerfile на самом деле будет содержать два определения изображений. Первый (основанный на одном из официальных образов Gradle ) инструктирует Docker запустить сборку Gradle нашего приложения Spring Boot . Второй выбрал бы двоичные файлы, созданные первым изображением, и создал окончательный образ Docker с нашим приложением Spring Boot, запечатанным внутри (так же, как мы делали раньше).
В статье объясняется запуск двух приложений Spring Boot в разных контейнерах docker, но они взаимодействуют с хост-системой и отображаются как единое целое.
1. Обзор
В этой статье мы сосредоточимся на том, как докеризировать приложение Spring Boot для запуска его в изолированной среде, известной как контейнер .
Кроме того, мы покажем, как создать композицию контейнеров, которые зависят друг от друга и связаны друг с другом в виртуальной частной сети. Мы также посмотрим, как ими можно управлять вместе с помощью отдельных команд.
Давайте начнем с создания простого приложения Spring Boot, которое мы затем запустим в легком базовом образе под управлением Alpine Linux .
2. Докеризация автономного приложения Spring Boot
С помощью правильно настроенного файла Maven мы можем создать исполняемый файл jar:
И запустите приложение Spring Boot:
Теперь у нас есть работающее приложение Spring Boot, к которому мы можем получить доступ по адресу localhost:8888/messages.
Чтобы докеризировать приложение, мы сначала создаем файл с именем Dockerfile со следующим содержимым:
Этот файл содержит следующую информацию:
- ИЗ : В качестве основы для нашего образа мы возьмем Java -enabled Alpine Linux , созданный в предыдущем разделе.
- СОПРОВОЖДАЮЩИЙ : Сопровождающий изображения.
- КОПИРОВАТЬ : Мы позволяем Докеру скопировать наш файл jar в изображение.
- ТОЧКА ВХОДА : Это будет исполняемый файл, который будет запущен при загрузке контейнера. Мы должны определить их как JSON-Array , потому что мы будем использовать ENTRYPOINT в сочетании с CMD для некоторых аргументов приложения.
Наконец, мы можем запустить контейнер из нашего образа:
Это запустит наше приложение в Docker, и мы сможем получить к нему доступ с хост-машины по адресу localhost:8887/messages . Здесь важно определить сопоставление портов, которое сопоставляет порт на хосте (8887) с портом внутри Docker ( 8888 ), который является портом, который мы определили в свойствах приложения Spring Boot.
Примечание: Порт 8887 может быть недоступен на машине, на которой мы запускаем контейнер. В этом случае сопоставление может не сработать, и нам нужно выбрать порт, который все еще доступен.
Если мы запустим контейнер в отдельном режиме, мы можем проверить его детали, остановить его и удалить с помощью следующих команд:
2.1. Изменение базового изображения
Мы можем легко изменить базовый образ, чтобы использовать другую версию Java. Например, если мы хотим использовать дистрибутив Corretto от Amazon, мы можем просто изменить файл Dockerfile :
Кроме того, мы можем использовать пользовательский базовый образ. Мы рассмотрим, как это сделать позже в этой статье.
3. Докеризованные приложения в составном
Команды Docker и Dockerfiles особенно подходят для создания отдельных контейнеров. Но если вы хотите работать в сети изолированных приложений , управление контейнерами быстро становится захламленным.
Чтобы решить эту проблему, Docker предоставляет инструмент с именем Docker Compose . Он поставляется с собственным файлом сборки в формате YAML и лучше подходит для управления несколькими контейнерами. Например, он может запускать или останавливать набор служб в одной команде или объединять выходные данные журнала нескольких служб вместе в один псевдо-tty .
3.1. Второе приложение Spring Boot
3.2. Файл Docker Compose
Мы можем объединить конфигурацию для обеих служб в одном файле с именем docker-compose.yml :
сервисы : Каждый объект в этом ключе определяет сервис , он же контейнер. Этот раздел является обязательным.
build : Если задано, docker-compose может создать образ из Dockerfile
- контекст : Если задан, он указывает каталог сборки, в котором ищется файл Dockerfile|/. dockerfile
- : Если задано, он задает альтернативное имя для Dockerfile. image
Прежде чем мы продолжим, мы проверим ваш файл сборки на наличие синтаксических ошибок:
Наконец, мы можем построить наши образы, создать определенные контейнеры и запустить их в одной команде:
Чтобы остановить контейнеры, удалите их из Docker и удалите из него подключенные сети , мы можем использовать противоположную команду:
Более подробное введение в docker-compose вы можете прочитать в нашей статье Введение в Docker Compose .
3.3. Услуги масштабирования
Но для того, чтобы это работало должным образом , мы должны удалить container_name из нашего docker-compose.yml , чтобы позволить Docker выбрать один , и мы должны изменить конфигурацию открытого порта , чтобы избежать столкновений.
Для портов мы можем указать Docker сопоставить диапазон портов на хосте с одним конкретным портом внутри Docker:
После этого мы можем масштабировать наши сервисы следующим образом (обратите внимание, что мы используем модифицированный yml-файл ):
Чтобы масштабировать наши службы, мы можем выполнить следующую команду:
4. Пользовательское Базовое изображение
Для этого мы можем использовать файл Dockerfile с Alpine в качестве базового образа и установить JDK по нашему выбору:
- FROM : Ключевое слово FROM указывает Docker использовать данное изображение с его тегом в качестве базы сборки. Если этого образа нет в локальной библиотеке, выполняется онлайн-поиск в Docker Hub или в любом другом настроенном удаленном реестре
- СОПРОВОЖДАЮЩИЙ :/| СОПРОВОЖДАЮЩИЙ обычно представляет собой адрес электронной почты, идентифицирующий автора изображения RUN
- : С помощью команды RUN мы выполняем командную строку оболочки в целевой системе. Здесь мы Alpine Linux менеджер пакетов apk для установки Java 8 OpenJDK
Чтобы окончательно создать образ и сохранить его в локальной библиотеке, мы должны запустить:
ОБРАТИТЕ ВНИМАНИЕ: Опция –tag даст изображению его имя и –rm=true удалит промежуточные изображения после того, как оно будет успешно построено. Последний символ в этой команде оболочки-точка, выступающая в качестве аргумента каталога сборки.
5. Поддержка пакетов сборки в Spring Boot 2.3
Spring Boot 2.3 добавлена поддержка buildpacks . Проще говоря, вместо того , чтобы создавать наш собственный файл Dockerfile и создавать его с помощью чего-то вроде docker build , все, что нам нужно, это выполнить следующую команду:
Чтобы это сработало, нам нужно, чтобы Docker был установлен и запущен.
Основной мотивацией buildpacks является создание такого же опыта развертывания, который некоторое время предоставляют некоторые известные облачные сервисы, такие как Heroku или Cloud Foundry. Мы просто запускаем цель build-image , и сама платформа заботится о создании и развертывании артефакта.
Более того, это может помочь нам более эффективно изменить способ создания изображений Docker . Вместо того, чтобы применять одно и то же изменение ко множеству файлов Dockerfile в разных проектах, все, что нам нужно сделать, это изменить или настроить конструктор изображений buildpacks.
В дополнение к простоте использования и лучшему общему опыту разработчиков, он также может быть более эффективным . Например, подход buildpacks создаст многоуровневый образ Docker и использует разнесенную версию файла Jar.
Давайте посмотрим, что произойдет после выполнения приведенной выше команды.
Когда мы перечислим доступные образы докеров:
Мы видим линию для только что созданного изображения:
Чтобы запустить наш контейнер, мы можем просто запустить:
Как и в случае с нашим встроенным образом, нам нужно сопоставить порт, чтобы наше приложение Spring Boot было доступно извне Docker.
6. Заключение
Как мы уже видели, теперь мы можем создавать пользовательские образы Docker , запускать приложение Spring Boot в качестве контейнера Docker и создавать контейнеры с помощью docker-compose .
Для получения дополнительной информации о файлах сборки мы ссылаемся на официальную ссылку Dockerfile и docker-compose.ссылка на yml .
Читайте также: