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

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

Открыта

Перед тем как мы начнем использовать 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 пайплайны.

На собеседованиях работодатель наверняка оценит ваши навыки работы с Docker, а в реальных проектах вы сэкономите массу времени на настройке окружения.

Теперь у вас есть все инструменты, чтобы упаковать и развернуть ваш проект! 🎉

Комментарии
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
У этой страницы еще нет ни одного комментария