Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Образ 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, как в примере выше.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.