Образ Docker
Docker упаковывает приложение вместе с окружением — нужной версией Java и настройками системы — в образ. Из образа запускают контейнер, и он работает одинаково на вашем ноутбуке, на сервере и в облаке. Для Spring Boot есть два способа получить образ: написать короткий Dockerfile или поручить сборку плагину Maven. Для этого урока нужен установленный Docker.
Dockerfile
Создайте файл в корне проекта, рядом с pom.xml:
# Dockerfile
FROM eclipse-temurin:25-jre
WORKDIR /app
COPY target/blog-0.0.1-SNAPSHOT.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]| Строка | Смысл |
|---|---|
FROM eclipse-temurin:25-jre | Основа — Linux с Java 25 (только среда выполнения, без компилятора) |
WORKDIR /app | Рабочая папка внутри образа |
COPY ... | Кладёт собранный JAR в образ |
EXPOSE 8080 | Подсказка, что приложение слушает порт 8080 |
ENTRYPOINT | Команда запуска контейнера |
Сначала соберите JAR, затем образ, и запустите контейнер:
./mvnw clean package
docker build -t blog .
docker run -p 8080:8080 blog-t blog даёт образу имя, -p 8080:8080 связывает порт компьютера с портом контейнера. Блог откроется на http://localhost:8080, как и раньше.
Без Dockerfile
Плагин Spring Boot умеет собирать образ сам с помощью Cloud Native Buildpacks:
./mvnw spring-boot:build-image
docker run -p 8080:8080 docker.io/library/blog:0.0.1-SNAPSHOTПлагин сам подбирает Java по java.version из pom.xml и раскладывает JAR по слоям: библиотеки отдельно от вашего кода. Пересборка после правки кода тогда идёт быстрее.
Вместе с базой
Приложению на сервере нужна PostgreSQL. Оба контейнера удобно описать в одном файле:
# compose.yaml
services:
db:
image: postgres:18
environment:
POSTGRES_DB: blog
POSTGRES_USER: blog
POSTGRES_PASSWORD: changeme
app:
image: blog
ports:
- "8080:8080"
environment:
SPRING_PROFILES_ACTIVE: prod
SPRING_DATASOURCE_URL: jdbc:postgresql://db:5432/blog
SPRING_DATASOURCE_USERNAME: blog
SPRING_DATASOURCE_PASSWORD: changeme
depends_on:
- dbКоманда docker compose up запустит оба контейнера. Настройки передаются переменными окружения — так же, как в прошлом уроке. Настоящий пароль в файл не пишут: на сервере его берут из секретов или из файла .env, который не попадает в Git.
Частая ошибка
Внутри контейнера localhost — это сам контейнер, а не ваш компьютер и не контейнер с базой. С адресом jdbc:postgresql://localhost:5432/blog приложение не запустится:
PSQLException: Подключение по адресу localhost:5432 отклонено. Проверьте, что хост и порт указаны правильно и что postmaster принимает TCP/IP-соединения.На системе с английским языком то же сообщение звучит как Connection to localhost:5432 refused.
В compose.yaml к базе обращаются по имени сервиса — db, как в примере выше.