Перш ніж ми почнемо використовувати Docker, давайте пригадаємо його ключові складові:
| Термін | Опис |
|---|---|
| Dockerfile | Файл з інструкціями, що описують, як зібрати Docker-образ |
| Image | Снимок застосунку з усім його оточенням. Його створюють на основі Dockerfile |
| Container | Робоча копія Docker-образу, запущена як окремий процес |
| Registry | Репозиторій, де зберігаються образи (наприклад, Docker Hub) |
Крок 1: Підготовка Dockerfile
Dockerfile — це рецепт, за яким готується Docker-образ. Для нашого Spring Boot-застосунку він виглядатиме наступним чином:
# Використовуємо базовий образ з Java 17
FROM openjdk:17-jdk-slim
# Вказуємо робочу директорію всередині контейнера
WORKDIR /app
# Копіюємо наш зкомпільований JAR-файл у контейнер
COPY target/myapp-0.0.1-SNAPSHOT.jar app.jar
# Вказуємо команду для запуску застосунку
ENTRYPOINT ["java", "-jar", "app.jar"]
Структура Dockerfile
- FROM: Вказуємо базовий образ. У нашому випадку це Java 17. Пізніше, при зміні версії JDK, достатньо буде просто замінити строку.
- WORKDIR: Задаємо робочу директорію всередині контейнера, де виконуватиметься наш код.
- COPY: Копіюємо файл
myapp-0.0.1-SNAPSHOT.jarз поточної папки в контейнер. - ENTRYPOINT: Визначаємо команду, яка запускається при старті контейнера.
Примітка: Перш ніж збирати Docker-образ, переконайся, що твій Spring Boot-проєкт зібраний за допомогою mvn clean package або ./gradlew bootJar. JAR-файл створюється в папці target або build/libs.
Крок 2: Збірка Docker-образу
Тепер, коли наш Dockerfile готовий, давайте зберемо Docker-образ. Відкрий термінал в кореневій папці проєкту (де лежить Dockerfile) і виконай команду:
docker build -t myapp .
На всякий випадок розшифруємо команду:
docker build: Інструкція для Docker зібрати образ.-t myapp: Вказуємо ім'я для образу (myapp)..: Задаємо поточну директорію як джерело для збірки.
Якщо все зроблено правильно, у результаті ти побачиш повідомлення на кшталт:
Successfully built <image-id>
Successfully tagged myapp:latest
Зібраний образ можна перевірити командою:
docker images
Крок 3: Запуск контейнера
Контейнер запускається з образу за допомогою команди docker run. Ось як це зробити:
docker run -p 8080:8080 myapp
У цій команді:
-p 8080:8080: Мапимо порт 8080 з контейнера на локальну машину.myapp: Ім'я нашого образу.
Якщо все пройшло успішно, твій застосунок буде доступний за адресою: http://localhost:8080. Вітаю, ти щойно запустив свій Spring Boot-застосунок у контейнері!
Крок 4: Оптимізація Dockerfile
Твій Docker-образ уже працює, але він може бути важкуватим, що збільшує час деплою. Давай оптимізуємо його!
Використаємо багатоетапну збірку:
# Етап 1: Збірка застосунку
FROM maven:3.8.5-openjdk-17 AS builder
WORKDIR /build
COPY pom.xml .
COPY src ./src
RUN mvn clean package -DskipTests
# Етап 2: Створення легкого образу
FROM openjdk:17-jdk-slim
WORKDIR /app
COPY --from=builder /build/target/myapp-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]
Тепер ми використовуємо Maven тільки на етапі збірки, а для виконання застосунку — легковагий образ openjdk:17-jdk-slim. Це значно зменшить розмір кінцевого Docker-образу.
Крок 5: Публікація Docker-образу
Щоб поділитися своїм образом або розгорнути його на сервері, його потрібно завантажити в Docker Registry. Найпопулярніший — Docker Hub.
1. Авторизуйся в Docker Hub:
docker login
2. Перейменуй образ (заміни username на свій логін):
docker tag myapp username/myapp:latest
3. Завантаж образ:
docker push username/myapp:latest
Тепер образ доступний для завантаження:
docker pull username/myapp:latest
Крок 6: Проблеми та їх вирішення
Під час роботи з контейнерами ти можеш стикнутися з низкою проблем:
- Не знайдено JAR-файл: Переконайся, що зібрав проєкт перед запуском команди
docker build. - Конфлікти портів: Якщо порт 8080 зайнятий, використовуй інший, наприклад:
docker run -p 9090:8080 myapp - Великий розмір образу: Використовуй легковагі образи (наприклад,
openjdk:17-jdk-slim). - Не працює доступ до бібліотек (наприклад, для БД): Контейнери ізольовані, переконайся, що вони можуть «бачити» твою базу. Використовуй Docker Compose для налаштування мережі.
Крок 7: Використання Docker Compose
Якщо застосунок використовує кілька сервісів (наприклад, база даних + застосунок), ми можемо налаштувати їх за допомогою Docker Compose.
Створи файл docker-compose.yml:
version: '3.8'
services:
app:
build:
context: .
ports:
- "8080:8080"
depends_on:
- db
db:
image: postgres:15
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: myappdb
Команда для запуску:
docker-compose up
Тепер Docker Compose підніме і застосунок, і базу даних одночасно!
Контейнеризація — це не просто модний тренд, а стандарт у сучасній розробці ПЗ. Образи Docker допомагають:
- Швидко розгорнути застосунок на сервері або в хмарі.
- Забезпечити ізоляцію та сумісність середовища.
- Автоматизувати CI/CD pipelines.
На співбесідах роботодавець точно оцінить твої навички роботи з Docker, а в реальних проєктах ти заощадиш купу часу на налаштуванні середовища.
Тепер у тебе є всі інструменти, щоб запакувати й розгорнути свій проєкт! 🎉
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ