JavaRush/Java блог/Java Developer/Как развернуть Postgres в Docker и подключить к Spring-Bo...
Павел
11 уровень

Как развернуть Postgres в Docker и подключить к Spring-Boot приложению

Статья из группы Java Developer
участников
Перед этим необходимо: - Установить Docker; - Установить IntelliJ IDEA Ultimate как получить бесплатно на 30 дней; - В Intellij IDEA установить плагин Docker. Например, вы создали Spring-Boot приложение с сущностью:
@Entity
public class Person {

    @Id
    @Column
    @GenericGenerator(name = "generator", strategy = "increment")
    @GeneratedValue(generator = "generator")
    Long id;

    @Column
    String name;

//конструктор, геттеры, сеттеры
}
Что бы реализовать подключение к Postgres выполняем следующие шаги: 1. В pom.xml вставляем зависимость
<!-- https://mvnrepository.com/artifact/org.postgresql/postgresql -->
<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>42.3.1</version>
</dependency>
2. В корневой папке проекта создаем файл: docker-compose.yaml (на скриншотах опечатка) На картинке корневая папка java-rush-docker Как развернуть Postgres в Docker и подключить ее к Spring-Boot приложению. - 1 Содержимое файла:
version: '3'

services:
  postgres:
    image: 'postgres:13'
    container_name: 'java-postgres'
    ports:
    - 5432:5432
    environment:
      - 'POSTGRES_USER=sa'
      - 'POSTGRES_HOST_AUTH_METHOD=trust'
      - 'POSTGRES_DB=java'
На одной строке с postgres: будет зеленая стрелочка, ее надо нажать. В нижней части IntelliJ IDEA во вкладке Services будет отображаться процесс, после выполнения должна появиться запись: Status: Downloaded newer image for postgres:13 Creating java-postgres ... 'Compose: docker-compouse.yaml' has been deployed successfully. Значит все хорошо. В левом окне появиться примерно следующее: Как развернуть Postgres в Docker и подключить ее к Spring-Boot приложению. - 2 Это значит, что в сервисе postgres поднялся контейнер java-postgres. В папке Images должен быть образ postgres 13. 3. В файле application.yaml (или application.properties) должны быть указаны следующие настройки:
spring:
  datasource:
    driverClassName: org.postgresql.Driver
    url: jdbc:postgresql://localhost:5432/postgres
    username: sa
    password:

  jpa:
    properties:
      hibernate:
        dialect: org.hibernate.dialect.PostgreSQLDialect
Теперь можно запускать Spring-Boot проект. 4. После того как проект запустился настраиваем подключение: Как развернуть Postgres в Docker и подключить ее к Spring-Boot приложению. - 3 Нажимаем вкладку Database, нажимаем «+» в выпавшем списке выбираем Postgres, в поле user вписываем имя пользователя (username: sa), проверяем есть ли коннекшен. Если все хорошо, то нажимаем Apply и Ok. Появится следующее окно: Как развернуть Postgres в Docker и подключить ее к Spring-Boot приложению. - 4 База данных развернута и подключена. Если захотелось узнать больше про Docker: В этой статье найдите видео про Docker и реализуйте то, что там показывается. Прочитайте мануал по основам Docker. Прихраните Основные команды Docker.
Комментарии (15)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
VorKos
Уровень 35
11 марта, 06:13
Добрый день! Подскажите, почему написанная программа с верно указанными настройками в файле .yml, не может подключиться к развернутому и запущенному контейнеру PostgreSQL? Docker-compose: version: "2" services: postgres: image: postgres:12.3 ports: - "5678:5678" environment: - 'POSTGRES_USER=root' - 'POSTGRES_PASSWORD=root' - 'POSTGRES_DB=contacts' volumes: - ./init.sql:/docker-entrypoint-initdb.d/init.sql Application.yaml: spring: jpa: properties: hibernate: dialect: org.hibernate.dialect.PostgreSQLDialect show-sql: true hibernate: ddl-auto: create-drop datasource: url: jdbc:postgresql://localhost:5678/contacts username: root password: root driverClassName: org.postgresql.Driver hikari: schema: contacts_schema init.sql: CREATE SCHEMA IF NOT EXISTS contacts_schema; CREATE TABLE IF NOT EXISTS contacts_schema.contact ( id BIGINT PRIMARY KEY, first_name VARCHAR(255) NOT NULL, last_name VARCHAR(255) NOT NULL, email VARCHAR(255) NOT NULL, phone VARCHAR(255) NOT NULL );
Павел
Уровень 11
11 марта, 07:59
Хз) попробуй тут ports: - "5678:5678" кавычки убрать
VorKos
Уровень 35
11 марта, 10:37
Не помогло) Есть еще предположение, что БД ожидает подключения при помощи SSL, только вопрос, как на это повлиять если так?
Павел
Уровень 11
14 марта, 13:21
в настройках подключения должен быть пункт use SSL
VorKos
Уровень 35
15 марта, 06:47
Павел, а где об этом можно почитать?
Петрович
Уровень 36
21 марта 2023, 13:13
у меня скромный вопрос, а зачем в данном случае использовать, docker-compose если просто можна использовать просто Docker в данном случае?
Вадим
Уровень 23
14 апреля 2022, 10:30
Пардон за нубство (галопом по европам), но pom файл нам при этом не нужен? те DockerCompose заменяет мавен? А так спасибо, своевременно, Еще бы продолжение -что с этим дальше делать?
Павел
Уровень 11
14 апреля 2022, 13:19
pom файл нам при этом не нужен? Нужен, там написано про pom. что с этим дальше делать? Это актуально для тех кто не может себе на пк поставить СУБД в открытом виде, например на маках возникает проблема с установкой постгреса
it
Уровень 21
31 июля 2023, 08:27
Это актуально для тех кто не может себе на пк поставить СУБД в открытом виде, например на маках возникает проблема с установкой постгреса
Павел, подскажи, то есть докер позволяет создать образ какой то технологии(например postgresql или mysqk), работать с этой субд, но при этом ее можно не скачивать? немного не пойму для чего в целом нужен докер, если я создаю веб-сайт, и мой комп выступает в качестве сервера, на нем стоит субд, остальные технологии, idea, потом я написал веб сервис использовал спринг и в результате для чего мне нужно использовать докер, или например взять готовый веб сервис - javarush, для чего jr использовать докер? что бы что?
Павел
Уровень 11
31 июля 2023, 10:19
то есть докер позволяет создать образ какой то технологии(например postgresql или mysqk), работать с этой субд, но при этом ее можно не скачивать? Да, приложение уже скачено за тебя в этот образ, если ты берешь какой то готовый. Или можешь скачать и положить любое другое приложение в пустой контейнер. Зачем нужен докер: Представим себе психбольницу для буйных, в которой есть одно большое помещение для пациентов. В одной большой камере содержаться всякие буйные психопаты, и если у одного из них переклинит, то достанется всем кто сидит с ним в камере. Логично будет всех их разделить. Строить для каждого психопата свою психушку - нерентабельно. А вот разделить большое помещение перегородками на несколько маленьких - нормальная идея. И получается что психушка - это твой комп (сервер). Психи это твои приложения, они иногда могут сходить с ума и портить жизнь всем вокруг. Покупать под каждую приложуху по системнику - это не правильно, а вот разделить их - это правильно. Докер как раз и может их разделить по контейнерам, и если вдруг БД решит вскрыть себе вены, то пострадает только она одна. для чего jr использовать докер? Для обеспечения работоспособности. Можно развернуть несколько рабочих копий сайта на разных контейнерах, когда один падает, то пользователя можно перенаправить на другой контейнер. И еще есть такое понятие "утилизация ресурсов" (рентабельное их использование). Обычно такие сайты арендуют места в ЦОД (центре обработки данных) такие большие сервера, и что бы не брать весь центр в аренду они арендуют какую то часть. Например весь ЦОД 1000ТБ, а они взяли 1 ГБ. И что бы отделить это место используют контейнеризацию, тут уже правда кубернетис работает, но суть примерно похожа) В джунах ты можешь ни чего особо и не знать про девопс, но что бы расти надо будет разбираться.
it
Уровень 21
31 июля 2023, 10:40
Сложна, но уже лучше понятно, Но все равно еще вопрос, пожалуйста) Сорри за многословность, не хочу стеснятся спрашивать, если есть возможность узнать :-) Ближе к делу, подальше от психушки) На простом примере: Есть у меня рест апи веб сервис, в нем есть репозитории, сервисы, контроллеры, модели, есть файл с ресурсами(конфигурация, скрипты и тп) есть view, запущена субд, и подключена к сервису.. Все работает, запрос-ответ обрабатываются.. Итак для чего мне стоит подключить Докер сюда? - сколько контейнеров нужно будет создать для такого сервиса, - типа в одном контейнере view в другом контроллер, в третьем, сервис, репозиторий, и т.д. отдельном контейнере БД, так?? - или тут отдельно сервис в одном контейнере, а БД в другом?? Окей, Говоришь, что если вдруг БД накроется, то на приложение не повлияет. - а как так? если БД не работает, то куда сохранять данные, откуда их брать? где они хранятся? в таком случае..
Павел
Уровень 11
1 августа 2023, 10:16
типа в одном контейнере view в другом контроллер, в третьем, сервис, репозиторий, - не так В контейнеры нужно ложить отдельные приложения, грубо говоря .jar файлы. БД в отдельный контейнер положить можно Про то что БД накроется: имелось ввиду что она упадет таким образом, что закрашится вся система, вся винда(или что там стоит) и все приложения на этом же серваке. Вот пример такой ошибки: https://javarush.com/groups/posts/3794-kak-svjazanih-konteynerih-i-java Если БД будет завернуто в контейнер, то пострадает только то что будет в контейнере. Сама приложуха которая в другом контейнере, будет работать, и может показать пользователю, что то вроде: "Извините, БД прилегла, но мы уже чиним, а пока сыграйте в тетрис." или направить на запасную БД.
it
Уровень 21
1 августа 2023, 11:28
Сама приложуха которая в другом контейнере, будет работать, и может показать пользователю, что то вроде: "Извините, БД прилегла, но мы уже чиним, а пока сыграйте в тетрис." или направить на запасную БД.
Ааа, понял.
https://javarush.com/groups/posts/3794-kak-svjazanih-konteynerih-i-java
Сейчас прочитаю, спасибо)
Yaroslav Golota Java/kotlin backend Devel в GoSolo Financial LTD
10 декабря 2021, 09:55
Ошибка в названии файла: docker-compouse.yaml -> docker-compose.yaml
Павел
Уровень 11
10 декабря 2021, 10:02
Спасибо! Самое смешное что но все равно работало😂 А ну понятно, в запуске есть разница, система распознавала его как docker но не как docker-compose