Перед тем как мы начнем использовать 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 /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 пайплайны.
На собеседованиях работодатель наверняка оценит ваши навыки работы с Docker, а в реальных проектах вы сэкономите массу времени на настройке окружения.
Теперь у вас есть все инструменты, чтобы упаковать и развернуть ваш проект! 🎉