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

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

Модуль 5. Spring
15 уровень , 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!

Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ