Автор оригинала: Karsten Silz.
1. Введение
В этом учебнике мы хотим запустить приложение Spring Boot с популярной базой данных с открытым исходным кодом PostgreSQL. В предыдущем статья мы смотрели на Докер Сочинять для обработки нескольких контейнеров одновременно . Таким образом, вместо установки PostgreSQL в качестве отдельного приложения, Мы будем использовать Docker Compose для запуска весенней загрузки и PostgreSQL .
2. Создание проекта «Весенняя загрузка»
Пойдем в Весенний инициализатор и создать наш проект Весенняя загрузка . Мы добавим PostgreSQL driver и Spring Data JPA Модули. После загрузки полученного файла и извлечения его в папку, мы можем запустить наше новое приложение:
./mvnw spring-boot:run
Приложение выходит из строя, поскольку не может подключиться к базе данных:
*************************** APPLICATION FAILED TO START *************************** Description: Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured. Reason: Failed to determine a suitable driver class
3. DockerFile
Прежде чем мы сможем начать PostgreSQL с Docker Compose, мы должны превратить наше приложение Spring Boot в изображение Docker . Первым шагом является пакет приложения в качестве файла JAR:
./mvnw clean package -DskipTests
Здесь мы сначала очищаем наши предыдущие сборки перед упаковкой приложения. Кроме того, мы пропускаем тесты, потому что они терпят неудачу без PostgreSQL.
Теперь у нас есть приложение JAR файл в целевые каталог. Этот файл имеет название проекта и номер версии в его названии и заканчивается -СНИМОК.JAR . Так что его название может быть докер-весна-загрузка-postgres-0.0.1-SNAPSHOT.jar .
Давайте делать новые src/main/docker каталог. После этого мы копим приложение JAR файл там:
cp target/docker-spring-boot-postgres-0.0.1-SNAPSHOT.jar src/main/docker
Наконец, мы создаем эту DockerFile в том же каталоге:
FROM adoptopenjdk:11-jre-hotspot ARG JAR_FILE=*.jar COPY ${JAR_FILE} application.jar ENTRYPOINT ["java", "-jar", "application.jar"]
Этот файл описывает, как Docker должен запускать наше приложение Spring Boot . Он использует Java 11 из ПринятьOpenJDK и копирует файл приложения JAR для применение.jar . Затем он запускает этот файл JAR, чтобы начать наше приложение Spring Boot.
4. Docker Compose файл
Теперь давайте напишем наш файл Docker Compose, docker-compose.yml , и сохранить его в src/main/docker :
version: '2' services: app: image: 'docker-spring-boot-postgres:latest' build: context: . container_name: app depends_on: - db environment: - SPRING_DATASOURCE_URL=jdbc:postgresql://db:5432/compose-postgres - SPRING_DATASOURCE_USERNAME=compose-postgres - SPRING_DATASOURCE_PASSWORD=compose-postgres - SPRING_JPA_HIBERNATE_DDL_AUTO=update db: image: 'postgres:13.1-alpine' container_name: db environment: - POSTGRES_USER=compose-postgres - POSTGRES_PASSWORD=compose-postgres
Название нашего приложения – приложение. Это первый из двух сервисов (линии 4-15):
- Spring boot Docker изображение имеет название docker-spring-boot-postgres:последний (линия 5). Докер строит это изображение из Доккерфил в текущем каталоге (линии 6-7)
- Название контейнера приложение (линия 8). Это зависит от DB обслуживание (линия 10). Вот почему она начинается после DB контейнер
- Наше приложение использует DB Контейнер PostgreSQL в качестве источника данных (линия 12). Имя базы данных, имя пользователя и пароль составной постгрес (линии 12-14)
- Hibernate будет автоматически создавать или обновлять любые таблицы баз данных, необходимые (строка 15)
База данных PostgreSQL имеет название DB и является вторым сервисным (линии 17-22):
- Мы используем PostgreS’L 13.1 (линия 18)
- Название контейнера DB (линия 19)
- Имя пользователя и пароль являются составной постгрес (линии 21-22)
5. Запуск с Docker Compose
Давайте забудем наше приложение Весенняя загрузка и PostgreSQL с Docker Compose :
docker-compose up
Во-первых, это позволит создать Docker Image для нашего приложения Spring Boot. Далее, он запустит контейнер PostgreSQL. Наконец, он запустит наше приложение Docker изображения. На этот раз наше приложение работает нормально:
Starting DemoApplication v0.0.1-SNAPSHOT using Java 11.0.9 on f94e79a2c9fc with PID 1 (/application.jar started by root in /) [...] Finished Spring Data repository scanning in 28 ms. Found 0 JPA repository interfaces. [...] Started DemoApplication in 4.751 seconds (JVM running for 6.512)
Как мы видим, Spring Data не нашла интерфейса репозитория. Это правильно – мы еще не создали!
Если мы хотим, чтобы остановить все контейнеры, мы должны нажать на “Ctrl-C” в первую очередь. Тогда мы можем остановить Docker Compose:
docker-compose down
6. Создание сущности клиента и репозитория
Чтобы использовать базу данных PostgreSQL в нашем приложении, Мы создадим простую клиентскую сущность :
@Entity @Table(name = "customer") public class Customer { @Id @GeneratedValue private long id; @Column(name = "first_name", nullable = false) private String firstName; @Column(name = "last_name", nullable = false) private String lastName;
Клиентская имеет генерируемую id атрибут и два обязательных атрибута: первоеимя и последнееимя .
Теперь, мы можем написать интерфейс репозитория для этой сущности :
public interface CustomerRepository extends JpaRepository{ }
Просто расширяя JpaRepository , мы наследуем методы создания и запроса наших Клиентская сущность.
Наконец, мы будем использовать эти методы в нашем приложении:
@SpringBootApplication public class DemoApplication { @Autowired private CustomerRepository repository; @EventListener(ApplicationReadyEvent.class) public void runAfterStartup() { List allCustomers = this.repository.findAll(); logger.info("Number of customers: " + allCustomers.size()); Customer newCustomer = new Customer(); newCustomer.setFirstName("John"); newCustomer.setLastName("Doe"); logger.info("Saving new customer..."); this.repository.save(newCustomer); allCustomers = this.repository.findAll(); logger.info("Number of customers: " + allCustomers.size()); } }
- Мы доступ к нашим Клиентская репозиторий через инъекцию зависимости
- Мы запрашиваем количество существующих клиентов с репозиторием – это будет ноль
- Затем мы создаем и спасаем клиента
- Когда мы снова запросим существующих клиентов, мы ожидаем найти того, кого мы только что создали
7. Запуск с докером Сочинять снова
Чтобы запустить обновленное приложение Spring Boot, нам нужно восстановить его первый. Поэтому мы выполняем эти команды еще раз в корневом каталоге проекта:
./mvnw clean package -DskipTests cp target/docker-spring-boot-postgres-0.0.1-SNAPSHOT.jar src/main/docker
Как восстановить изображение Docker с помощью обновленного файла JAR приложения? Лучший способ заключается в удалении существующего изображения Docker, имя которого мы указали в докер-compose.yml . Это заставляет Docker создать изображение снова в следующий раз, когда мы начнем наш файл Docker Compose:
cd src/main/docker docker-compose down docker rmi docker-spring-boot-postgres:latest docker-compose up
Таким образом, после остановки наших контейнеров, мы удаляем приложение Docker изображения. Затем мы снова запускаем файл Docker Compose, который восстанавливает изображение приложения.
Вот выход приложения:
Finished Spring Data repository scanning in 180 ms. Found 1 JPA repository interfaces. [...] Number of customers: 0 Saving new customer... Number of customers: 1
Spring Boot находит наш пустой репозиторий клиентов. Таким образом, мы начинаем без клиента, но затем успешно создать один.
8. Заключение
В этом коротком учебнике мы начали с создания приложения Spring Boot для PostgreSQL. Затем мы написали файл Docker Compose для запуска контейнера с приложением с контейнером PostgreSQL.
Наконец, мы создали объект клиента и репозиторий, что позволило нам сохранить клиента в PostgreSQL.
Как обычно, исходный код для этого учебника можно найти более на GitHub .