Автор оригинала: Dhananjay Singh.
Обзор
В этой статье мы рассмотрим процесс создания Docker образа приложения Spring Boot с использованием Dockerfile и Maven , а затем запустим созданный образ.
Исходный код этого руководства можно найти на Github .
В этом руководстве предполагается, что на вашем компьютере установлен Docker. Если нет, вы можете следовать официальному руководству Docker по установке в зависимости от вашей операционной системы.
Если вы хотите узнать больше о Docker, мы подробно рассмотрели его в разделе “Docker: Введение на высоком уровне”.
Приложение Spring Boot
Давайте начнем с простого приложения Spring Boot. Лучший способ начать со скелетного проекта-посетить Spring Initializr . Выберите предпочитаемую версию Spring Boot и добавьте зависимость “Веб”. Создайте его как проект Maven, и все готово!
Проект включает в себя простой контроллер REST с одним отображением, который просто ожидает имя в качестве переменной пути, а затем генерирует строку для приветствия:
@RestController public class DemoController { @GetMapping("/greet/{name}") public String greeting(@PathVariable String name) { return "Hi!! " + name; } }
Чтобы запустить приложение, используйте следующую команду Maven из корневой папки проекта:
$ mvn spring-boot:run
Как обычно, приложение будет запущено на порту 8080. Чтобы проверить эту конечную точку, перейдите в свой браузер (или используйте curl , postman и т.д.) в ” http://localhost:8080/greet/john “, вы увидите ответ, который выглядит примерно так:
Настройка приложения для загрузки Spring
Теперь давайте закрепим наше ранее созданное приложение Spring Boot. Мы рассмотрим два наиболее часто используемых подхода:
- Dockerfile – Указание файла, содержащего собственные команды Docker для создания образа
- Maven – Использование плагина Maven для создания изображения
Докеризация с помощью Dockerfile
Файл Dockerfile-это обычный файл .txt
, содержащий собственные команды Docker, которые используются для указания слоев изображения. Для этого давайте создадим текстовый файл с именем “Dockerfile”:
Содержимое самого файла может выглядеть примерно так:
FROM java:8-jdk-alpine COPY ./target/demo-docker-0.0.1-SNAPSHOT.jar /usr/app/ WORKDIR /usr/app RUN sh -c 'touch demo-docker-0.0.1-SNAPSHOT.jar' ENTRYPOINT ["java","-jar","demo-docker-0.0.1-SNAPSHOT.jar"]
Давайте взглянем на команды и полностью поймем их, прежде чем продолжить:
- FROM – Ключевое слово
FROM
указывает Докеру использовать данное базовое изображение в качестве базы сборки. Мы использовали “java” с тегом “8-jdk-alpine”. Думайте о теге как о версии. Базовое изображение меняется от проекта к проекту. Вы можете искать изображения в docker-hub . - КОПИРОВАТЬ – Это указывает Докеру копировать файлы из локальной файловой системы в определенную папку внутри образа сборки. Здесь мы копируем ваш файл
.jar
в образ сборки (образ Linux) внутри/usr/app
. - WORKDIR – Инструкция
WORKDIR
задает рабочий каталог для любыхЗАПУСК
,CMD
,ТОЧКА ВХОДА
,КОПИРОВАНИЕ
иДОБАВЛЕНИЕ
инструкций, которые следуют в файле Dockerfile. Здесь мы переключили рабочий каталог на/usr/app
, чтобы нам не приходилось снова и снова писать длинный путь. - ВЫПОЛНИТЬ – Это указывает Докеру выполнить командную строку оболочки в целевой системе. Здесь мы практически просто “касаемся” вашего файла, чтобы обновить время его модификации (по умолчанию Docker создает все файлы-контейнеры в “неизмененном” состоянии).
- ТОЧКА ВХОДА – Это позволяет настроить контейнер, который будет выполняться как исполняемый файл. Здесь вы указываете Докеру, как запустить ваше приложение. Мы знаем , что запускаем наше приложение spring-boot как
java-jar <имя приложения>.jar
, поэтому помещаем его в массив.
Дополнительную документацию можно найти на странице Ссылка на файл Dockerfile .
Прежде чем двигаться дальше, нам понадобится файл Spring Boot .jar
. Этот файл будет использоваться для создания образа Docker, как упоминалось выше.
Выполните команду mvn clean install
, чтобы убедиться, что она сгенерирована.
Давайте построим изображение, используя этот файл Dockerfile. Для этого перейдите в корневой каталог приложения и выполните следующую команду:
$ docker build -t greeting-app .
Мы построили изображение с помощью docker build
. Мы дали ему имя с флагом -t
и указали текущий каталог, в котором находится файл Dockerfile. Образ создается и хранится в нашем локальном реестре докеров.
Давайте проверим наше изображение:
$ docker images
И, наконец, давайте запустим наш образ:
$ docker run -p 8090:8080 greeting-app
Git Essentials
Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!
Мы можем запускать изображения Docker с помощью команды docker run
.
Мы знаем, что каждый контейнер сам по себе является изолированной средой, и мы должны сопоставить порт операционной системы хоста – 8090
и порт внутри контейнера – 8080
, который указан в качестве аргумента -p 8090:8080
.
Теперь мы можем получить доступ к конечной точке на http://localhost:8080/greet/john
:
Наше приложение Spring Boot успешно запущено в контейнере Docker!
Докеризация с использованием Maven
В предыдущем разделе мы написали простой файл Dockerfile и построили наше приложение, используя собственную команду docker build
. Однако есть несколько проблем, с которыми мы можем столкнуться в наших проектах, использующих этот метод:
-
.jar
имя – Мы должны упомянуть имя jar (вместе с версией) в файле. По мере роста нашего приложения наши версии будут меняться, и нам придется снова и снова обновлять этот файл Dockerfile. - Использование терминала – Мы должны вручную открыть терминал и выполнить команды Docker. Было бы неплохо, если бы мы могли сделать это частью жизненного цикла Maven, чтобы мы могли создавать изображения как часть наших конвейеров CI/CD (Непрерывная интеграция/Непрерывная доставка).
Существует множество доступных плагинов Maven, которые мы можем использовать в вашем pom.xml
файл, который значительно облегчил бы нашу жизнь. Способ, которым работает этот плагин Maven, заключается в том, что он внутренне создает файл Dockerfile на основе конфигурации в pom.xml
файл, а затем использует сгенерированный файл Dockerfile для создания образа.
Используя этот метод, нам не нужно вручную обновлять имя или запускать терминал.
Мы будем использовать fabric8 io/docker-maven-плагин .
Плагин должен быть расположен в нашем pom.xml
файл после тега build
. Это будет дополнительный плагин для сборки с использованием профилей Maven. Всегда рекомендуется использовать это через профили, потому что мы хотим, чтобы обычная команда mvn clean install
работала на компьютере разработчика, на котором также не установлен Docker:
docker io.fabric8 docker-maven-plugin 0.26.0 true true ${project.artifactId} java:8-jdk-alpine java -jar /maven/${project.artifactId}-${project.version}.jar artifact build post-integration-test build
Давайте рассмотрим это поближе:
- Наш профиль называется
docker
– Если нам нужно создать изображение с помощью Maven, мы должны запустить команду с помощью-Docker
. - Тег
<имя>
– Этот тег указывает имя изображения, которое являетсяartifactId
– в нашем случае этодемо-докер
. - Тег
| | - Этот тег указывает базовое изображение
java:8-jdk-alpine.
Тег - | | – Этот тег используется для указания того, как должно выполняться изображение.
Теперь давайте построим образ:
$ mvn clean install -Ddocker
Давайте проверим наше изображение:
$ docker images
Наконец, мы запустим наш образ:
$ docker run -p 8090:8080 demo-docker
Теперь проверьте конечную точку REST ( http://localhost:8090/greet/john ) в браузере.
Примечание: Вы должны остановить ранее запущенные контейнеры, использующие порт 8090
, иначе вы получите сообщение об ошибке.
Вы можете легко проверить, какие контейнеры запущены с помощью:
$ docker ps
Теперь, если порт уже используется, вы можете либо изменить порт, либо удалить старый контейнер с помощью:
$ docker rm -f
Еще один простой способ-остановить все контейнеры:
$ docker rm -f $(docker ps -a -q)
Вывод
В этой статье мы рассмотрели два наиболее часто используемых способа контейнеризации приложения Spring Boot с помощью Docker.
Первый подход был реализован с помощью простого файла Dockerfile для создания изображения, а второй подход заключается в использовании плагина Maven.
Как только образ создан, существует множество способов его запуска. В этой статье мы полагались на собственную команду docker run
. Более доступный способ-использовать docker-compose , если у вас много изображений, которые вам нужно запустить.
Для производственной среды мы обычно выбираем Kubernetes или Docker-swarm , чтобы автоматически масштабировать наше приложение на основе сетевого трафика.