Перед тим, як зануритися в код, давайте розберемося, чому 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"]
Що тут відбувається:
- Перший етап: завантажуємо
maven, збираємо проєкт (без тестів, для прискорення). - Другий етап: використовуємо легкий образ
jre(лише JVM, без інструментів розробки), копіюємо зібраний JAR у контейнер.
Такий підхід зменшить розмір фінального образу, оскільки Maven та вихідний код не потраплять до кінцевого образу.
Практика: Створення та тестування контейнера
Повний цикл:
- Створіть JAR-файл вашого застосунку:
mvn clean package - Побудуйте образ:
docker build -t your-app-name:1.0.0 . - Запустіть контейнер:
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
Типові помилки та як їх уникнути
- Помилка: "Connection refused" при спробі доступу до контейнера. Це відбувається, якщо контейнер не пробросив порти. Переконайтеся, що при запуску вказано
-p 8080:8080. - Помилка: "No such file or directory" при запуску контейнера. Переконайтеся, що шлях до JAR-файлу в
COPYвсередині Dockerfile вказаний правильно. - Образ надто великий. Використовуйте багатоступеневу збірку, як описано вище.
- Застосунок не знаходить базу даних. Налаштуйте змінні оточення, щоб застосунок міг підключатися до зовнішніх ресурсів, наприклад до бази даних.
Як Docker допомагає в реальному житті?
- На співбесідах: вміння створювати контейнери й працювати з Dockerfile — must-have для сучасних розробників.
- У проєктах: використовуючи Docker, можна швидко піднімати як локальні середовища, так і production-оточення.
- У мікросервісах: кожен мікросервіс можна запускати в окремому контейнері. Оновлення, масштабування та керування стають простішими.
Якщо вам вдасться освоїти Docker і інтеграцію зі Spring Boot, ви станете незамінним у команді! Готуйтесь використовувати ці знання в майбутніх лекціях, присвячених розгортанню в хмари та мікросервісній архітектурі.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ