Напомним, 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!
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ