Невозможно установить соединение между приложением Spring Boot, работающим в контейнере Docker, и базой данных PostgreSQL, работающей в другом контейнере Docker

docker-compose.yml

version: '3.8'
services:
  db:
    image: postgres
    restart: always
    container_name: security-db
    environment:
      POSTGRES_DB: security-db
      POSTGRES_USER: scrty
      POSTGRES_PASSWORD: scrty123
    ports:
      - '5050:5432'

application.properties

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
spring.datasource.url=jdbc:postgresql://localhost:5050/security-db
spring.datasource.username=scrty
spring.datasource.password=scrty123
spring.jpa.hibernate.ddl-auto=update

Я пытаюсь запустить приложение Spring Boot внутри контейнера Docker, а также запускаю базу данных PostgreSQL в другом контейнере Docker. Однако мое приложение не может установить соединение с базой данных PostgreSQL.

Оба контейнера работают на одной машине? Можете ли вы опубликовать docker-compose.yaml контейнера вашего приложения?

Raphi1 26.05.2024 18:50

Да, оба приложения работают на моем локальном компьютере. Версия @Raphi1: '3.8' службы: db: изображение: перезапуск postgres: всегда имя_контейнера: среда Security-DB: POSTGRES_DB: Security-DB POSTGRES_USER: scrty POSTGRES_PASSWORD: scrty123 порты: - '5050:5432'

scofield1 26.05.2024 18:56

Можете ли вы запустить приложение из IDE с заданным application.properties, без докера?

Raphi1 26.05.2024 19:01

Итак, у вашего приложения нет docker-compose.yaml, только DOCKERFILE?

Raphi1 26.05.2024 19:03

Когда я запускаю приложение в IDE с этим docker-compose.yml, оно работает, но когда я пытаюсь запустить докер-контейнер приложения, оно не работает @Raphi1

scofield1 26.05.2024 19:29

Как запустить Docker-контейнер приложения? У вас нет docker-compose.yaml для вашего приложения? У вас есть Dockerfile для приложения? Вы опубликовали только docker-compose.yaml, содержащий контейнер вашей базы данных.

Raphi1 26.05.2024 19:39

это мой файл докеров. Когда я создаю из этого файла докер-контейнер и запускаю его, я получаю сообщение об ошибке. ИЗ openjdk:21 ARG JAR_FILE=target/*.jar КОПИРОВАТЬ target/BookStore-0.0.1-SNAPSHOT.jar bookstore.jar ENTRYPOINT ["java","-jar","bookstore.jar"] @Raphi1

scofield1 26.05.2024 19:43
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
7
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема в том, что контейнеры работают в разных сетях и поэтому не могут взаимодействовать друг с другом. Вы можете решить эту проблему, поместив свое приложение также в свой docker-compose.yaml, поскольку docker Compose автоматически создаст сеть, и все службы присоединятся. Для этого вы можете изменить свой docker-compose.yaml следующим образом:

Решение 1:

version: '3.8'
services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    image: app:latest
  db:
    image: postgres
    restart: always
    container_name: security-db
    environment:
      POSTGRES_DB: security-db
      POSTGRES_USER: scrty
      POSTGRES_PASSWORD: scrty123
    ports:
      - '5050:5432'

Таким образом, вам вообще не нужно раскрывать порт 5050, если вы не хотите получать доступ к базе данных со своего хоста. В app.image вы можете поместить все, что захотите, это имя вашего изображения, которое будет создано и помечено при выполнении docker compose up --build. app.build.context укажет контекст сборки докера, а app.build.dockerfile укажет ваш Dockerfile.

Решение 2.

Вы также можете создать сеть вручную с помощью следующей команды:

docker network create -d bridge my-bridge-network

Это создаст сеть докеров под названием my-bridge-network. Теперь вам нужно подключить оба ваших контейнера к этой сети. Выполните следующую команду для обоих ваших контейнеров (базы данных и приложения).

docker network connect <NETWORK> <CONTAINER>

где вы заменяете <NETWORK> на созданное вами имя сети и <CONTAINER> на имя вашего контейнера.

Другие вопросы по теме