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

Лекція 148: Інтеграція Docker зі Spring Boot для контейнеризації застосунків

Модуль 5. Spring
Рівень 22 , Лекція 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

Типові помилки та як їх уникнути

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

Як Docker допомагає в реальному житті?

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

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

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ