Нагадаю, 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 додатку.
Поради та типові помилки
- Якщо jar-файл не створюється, переконайтеся, що ви успішно зібрали проєкт за допомогою Maven (
mvn clean package). - Якщо Docker-образ не збирається, перевірте, чи правильно вказані шляхи в
Dockerfile. - Якщо додаток у контейнері не запускається, дивіться логи через
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!
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ