JavaRush /Курси /Модуль 5. Spring /Лекція 159: Контейнеризація проєкту з використанням Docke...

Лекція 159: Контейнеризація проєкту з використанням Docker

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

Перш ніж ми почнемо використовувати 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

  1. FROM: Вказуємо базовий образ. У нашому випадку це Java 17. Пізніше, при зміні версії JDK, достатньо буде просто замінити строку.
  2. WORKDIR: Задаємо робочу директорію всередині контейнера, де виконуватиметься наш код.
  3. COPY: Копіюємо файл myapp-0.0.1-SNAPSHOT.jar з поточної папки в контейнер.
  4. 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: Проблеми та їх вирішення

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

  1. Не знайдено JAR-файл: Переконайся, що зібрав проєкт перед запуском команди docker build.
  2. Конфлікти портів: Якщо порт 8080 зайнятий, використовуй інший, наприклад:
    
    docker run -p 9090:8080 myapp
    
  3. Великий розмір образу: Використовуй легковагі образи (наприклад, openjdk:17-jdk-slim).
  4. Не працює доступ до бібліотек (наприклад, для БД): Контейнери ізольовані, переконайся, що вони можуть «бачити» твою базу. Використовуй 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, а в реальних проєктах ти заощадиш купу часу на налаштуванні середовища.

Тепер у тебе є всі інструменти, щоб запакувати й розгорнути свій проєкт! 🎉

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