JavaRush /Курсы /Модуль 5. Spring /Лекция 148: Интеграция Docker с Spring Boot для контейнер...

Лекция 148: Интеграция Docker с Spring Boot для контейнеризации приложений

Модуль 5. Spring
15 уровень , 7 лекция
Открыта

Перед тем, как погрузиться в код, давайте разберёмся в том, почему Docker так важен. Представьте, что ваш Spring Boot проект работает идеально на локальной машине, но на сервере он начинает "капризничать": не та версия Java, не установлены нужные библиотеки, а, может, сервер вообще убежал на кофе-брейк. Docker решает эти проблемы, создавая контейнеры, которые самодостаточны, портативны и предсказуемы.

Теперь, когда вы готовы превратить ваш Spring Boot проект в контейнер, давайте погрузимся в практическую часть.


Настройка Docker для Spring Boot

Чтобы интегрировать Spring Boot с Docker, нам понадобится несколько ключевых шагов. Всё начинается с создания Dockerfile.

Шаг 1: Создание Dockerfile

Dockerfile — это магический файл, который говорит Docker, как упаковать ваше приложение. Внутри мы указываем базовый образ (например, openjdk), копируем ваш JAR-файл и говорим Docker, как запускать приложение.

Вот как будет выглядеть минимальный Dockerfile для Spring Boot:


# Используем базовый образ с Java 17 (или вашей версией)
FROM eclipse-temurin:17-jdk

# Указываем рабочую директорию внутри контейнера
WORKDIR /app

# Копируем JAR файл в контейнер
COPY target/your-app-name-1.0.0.jar app.jar

# Указываем команду для запуска приложения
ENTRYPOINT ["java", "-jar", "app.jar"]
  • FROM: базовый образ для контейнера (в данном случае, это OpenJDK).
  • WORKDIR: задаёт рабочую директорию внутри контейнера.
  • COPY: перемещает файлы из вашего локального проекта в контейнер.
  • ENTRYPOINT: указывает команду, которая запускается, когда контейнер стартует.

Обратите внимание: target/your-app-name-1.0.0.jar — это ваш собранный JAR-файл, созданный ранее с помощью Maven (mvn package).

Шаг 2: Сборка Docker-образа

После того как Dockerfile готов, создадим Docker-образ. Образ — это "упакованная версия" вашего приложения, которая содержит всё необходимое:


docker build -t your-app-name:1.0.0 .
  • -t your-app-name:1.0.0: даёт имя и версию вашему образу.
  • .: указывает текущую директорию, где лежит Dockerfile.

Если всё прошло успешно, вы должны увидеть что-то вроде:


Successfully built <image-id>

Проверить, создан ли образ, можно с помощью команды:


docker images

Шаг 3: Запуск контейнера

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


docker run -p 8080:8080 your-app-name:1.0.0
  • -p 8080:8080: пробрасывает порт вашего локального компьютера в контейнер. Например, ваш Spring Boot приложение обслуживает запросы на localhost:8080.
  • your-app-name:1.0.0: имя образа, который мы только что создали.

После выполнения этой команды приложение должно быть доступно по адресу http://localhost:8080.


Практика: Улучшение Dockerfile

Минимального Dockerfile достаточно для "начала", но мы можем сделать его лучше.

Docker-образы можно оптимизировать, чтобы они занимали меньше места. Для этого используют метод "многоступенчатой сборки".

Вот улучшенный Dockerfile:


# Первый этап: сборка приложения
FROM maven:3.8.7-eclipse-temurin-17 AS builder

WORKDIR /build
COPY pom.xml ./
COPY src ./src

RUN mvn clean package -DskipTests

# Второй этап: создание минимального образа
FROM eclipse-temurin:17-jre

WORKDIR /app
COPY --from=builder /build/target/your-app-name-1.0.0.jar app.jar

ENTRYPOINT ["java", "-jar", "app.jar"]

Что здесь происходит:

  1. Первый этап: скачиваем maven, собираем проект (без тестов, для ускорения).
  2. Второй этап: используем лёгкий образ jre (только JVM, без инструментов разработки), копируем собранный JAR в контейнер.

Этот подход уменьшит размер итогового образа, так как Maven и исходный код в конечный образ не попадут.


Практика: Создание и тестирование контейнера

Полный цикл:

  1. Создайте JAR-файл вашего приложения:
    
    mvn clean package
    
  2. Постройте образ:
    
    docker build -t your-app-name:1.0.0 .
    
  3. Запустите контейнер:
    
    docker run -p 8080:8080 your-app-name:1.0.0
    

Теперь вы можете протестировать приложение в браузере или с помощью Postman.


Работа с переменными окружения

В реальных приложениях часто нужно настраивать параметры (например, подключение к базе данных). Вместо того, чтобы "зашивать" их в код, лучше использовать переменные окружения.

Обновим Dockerfile для работы с переменными окружения:


ENV SPRING_PROFILES_ACTIVE=prod

ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=${SPRING_PROFILES_ACTIVE}", "app.jar"]

Теперь активный профиль Spring можно настроить через параметр SPRING_PROFILES_ACTIVE. Например:


docker run -p 8080:8080 -e SPRING_PROFILES_ACTIVE=dev your-app-name:1.0.0

Typичные ошибки и как их избежать

  1. Ошибка: "Connection refused" при попытке доступа к контейнеру. Это происходит, если контейнер не пробросил порты. Убедитесь, что при запуске указано -p 8080:8080.
  2. Ошибка: "No such file or directory" при запуске контейнера. Убедитесь, что путь к JAR-файлу в COPY внутри Dockerfile указан правильно.
  3. Образ слишком большой. Используйте многоступенчатую сборку, как описано выше.
  4. Приложение не находит базу данных. Настройте переменные окружения, чтобы приложение могло подключаться к внешним ресурсам, например, базе данных.

Как Docker помогает в реальной жизни?

  • На собеседованиях: умение создавать контейнеры и работать с Dockerfile — must-have для современных разработчиков.
  • На проектах: используя Docker, можно быстро поднимать как локальные среды, так и продакшн-окружения.
  • В микросервисах: каждый микросервис можно запускать в отдельном контейнере. Обновление, масштабирование и управление становятся проще.

Если вам удастся освоить Docker и интеграцию с Spring Boot, вы станете незаменимым для команды! Готовьтесь использовать эти знания в будущих лекциях, посвящённых деплою в облака и микросервисной архитектуре.

Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ