JavaRush /Курси /Модуль 5. Spring /Лекція 149: Практика: створення Docker-образу для Spring ...

Лекція 149: Практика: створення Docker-образу для Spring Boot додатку

Модуль 5. Spring
Рівень 22 , Лекція 8
Відкрита

Нагадаю, Docker дозволяє:

  • Створювати контейнери, які включають не лише ваш додаток, а й усі його залежності.
  • Забезпечувати портативність, бо контейнер працює однаково скрізь.
  • Ізолювати додатки один від одного.
  • Спрощувати розгортання в хмару, на сервери або навіть на ваш локальний ноутбук.

Готові? Тоді починаємо!


Структура проєкту

Перш за все, переконайтеся, що у вас є готовий Spring Boot додаток зі збіркою jar-файлу через Maven. Наприклад, структура вашого проєкту може виглядати так:


my-spring-boot-app/
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── com.example.demo/
│   │   │       ├── DemoApplication.java
│   │   │       └── controllers/
│   │   │           └── HelloController.java
│   │   └── resources/
│   │       └── application.properties
├── pom.xml
├── target/
│   └── my-spring-boot-app-0.0.1-SNAPSHOT.jar
└── Dockerfile

Файл Dockerfile створимо сьогодні.


Крок 1: Створення Dockerfile

Dockerfile — це «рецепт» для збірки Docker-образу. Відкрийте ваш проєкт і створіть новий файл з іменем Dockerfile в кореневій директорії.

Мінімальний приклад Dockerfile


# Використовуємо базовий образ з встановленою Java
FROM openjdk:17-jdk-slim

# Встановлюємо робочу директорію всередині контейнера
WORKDIR /app

# Копіюємо jar-файл додатку в контейнер
COPY target/my-spring-boot-app-0.0.1-SNAPSHOT.jar app.jar

# Вказуємо команду для запуску додатку
ENTRYPOINT ["java", "-jar", "app.jar"]
  • FROM openjdk:17-jdk-slim
    Вказує базовий образ для контейнера. Це легковаговий образ з Java 17.
  • WORKDIR /app
    Встановлює робочу директорію всередині контейнера, у якій виконуватиметься додаток.
  • COPY target/my-spring-boot-app-0.0.1-SNAPSHOT.jar app.jar
    Копіює файл app.jar із локальної директорії target у директорію /app контейнера.
  • ENTRYPOINT ["java", "-jar", "app.jar"]
    Вказує команду, що запускається при старті контейнера.

Крок 2: Збірка Docker-образу

Тепер, коли Dockerfile готовий, можна зібрати Docker-образ. Виконайте наступні команди в терміналі:


# Перейдіть у папку проєкту
cd /path/to/my-spring-boot-app

# Зберіть jar-файл, якщо його ще немає
mvn clean package

# Зберіть Docker-образ
docker build -t my-spring-boot-app:latest .
  • docker build
    Команда для збірки Docker-образу.
  • -t my-spring-boot-app:latest
    Вказує ім'я (тег) для створюваного образу. Це "my-spring-boot-app", версія "latest".
  • .
    Вказує директорію, де знаходиться Dockerfile.

Крок 3: Запуск Docker-контейнера

Після збірки образу можна запустити його як контейнер:


docker run -d -p 8080:8080 --name spring-app my-spring-boot-app:latest
  • -d
    Запускає контейнер у фоновому режимі (detached mode).
  • -p 8080:8080
    Пробросує порт 8080 хоста на порт 8080 контейнера.
  • --name spring-app
    Задає ім'я контейнеру.
  • my-spring-boot-app:latest
    Вказує ім'я використовуваного Docker-образу.

Тепер ваш додаток доступний за адресою http://localhost:8080.


Крок 4: Перевірка роботи контейнера

Щоб переконатися, що контейнер працює, виконайте наступні команди:


# Перевірте запущені контейнери
docker ps

# Подивіться логи додатку
docker logs spring-app

Ви повинні побачити логи роботи вашого Spring Boot додатку.


Поради та типові помилки

  1. Якщо jar-файл не створюється, переконайтеся, що ви успішно зібрали проєкт за допомогою Maven (mvn clean package).
  2. Якщо Docker-образ не збирається, перевірте, чи правильно вказані шляхи в Dockerfile.
  3. Якщо додаток у контейнері не запускається, дивіться логи через docker logs spring-app.

Додаткові налаштування Dockerfile

1. Вказання змінних середовища

Можна передавати змінні в контейнер:


ENV SERVER_PORT=8080
ENTRYPOINT ["java", "-jar", "app.jar", "--server.port=${SERVER_PORT}"]

Тепер можна вказати порт при запуску контейнера:


docker run -d -p 9090:9090 -e SERVER_PORT=9090 my-spring-boot-app:latest

2. Зменшення розміру Docker-образу

Легковагові образи допомагають економити місце. Замість образу openjdk використовуйте distroless:


FROM gcr.io/distroless/java:17
COPY target/my-spring-boot-app-0.0.1-SNAPSHOT.jar app.jar
CMD ["app.jar"]

Що далі?

З Docker ваші додатки можуть однаково працювати на розробницькому ноутбуці, сервері чи в хмарі. На наступному етапі ми навчимося завантажувати Docker-образи в хмарні реєстри та розгортати їх на платформах, таких як AWS або Kubernetes!

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