Ошибка подключения при доступе к док-контейнеру postgres

Недавно я настроил проект prisma, и вот мой файл docker-compose.yml

version: '3'
services:
  prisma:
    image: prismagraphql/prisma:1.31
    restart: always
    ports:
      - '4030:4466'
    environment:
      TZ: ${PRISMA_DB_TIME_ZONE}
      PRISMA_CONFIG: |
        port: 4466
        # managementApiSecret: my-secret
        databases:
          default:
            connector: postgres
            host: postgres
            port: 5432
            user: prisma
            password: ${PRISMA_DB_PASSWORD}
            migrations: true
            rawAccess: true
  postgres:
    image: postgres:10.3
    restart: always
    ports:
    - "3306:3306"
    environment:
      POSTGRES_USER: prisma
      POSTGRES_PASSWORD: ${PRISMA_DB_PASSWORD}
      TZ: ${PRISMA_DB_TIME_ZONE}
    volumes:
      - postgres:/var/lib/postgresql/data
volumes:
   prisma:
   postgres:

Я могу открыть игровую площадку prisma, и она работает без проблем. но я не могу создать прямое подключение к контейнеру postgre с помощью dbeaver.

Сообщение об ошибке dbeaver

Connection reset

Почему мое соединение с базой данных не работает?

Это фото будет полезно. enter image description here

3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
1
0
812
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

postgres по умолчанию прослушивает порт 5432.

В спецификации контейнера postgres вы должны указать порт 5432, а не 3306.

version: '3'
services:
  prisma:
    image: prismagraphql/prisma:1.31
    restart: always
    ports:
      - '4030:4466'
    environment:
      TZ: ${PRISMA_DB_TIME_ZONE}
      PRISMA_CONFIG: |
        port: 4466
        # managementApiSecret: my-secret
        databases:
          default:
            connector: postgres
            host: postgres
            port: 5432
            user: prisma
            password: ${PRISMA_DB_PASSWORD}
            migrations: true
            rawAccess: true
  postgres:
    image: postgres:10.3
    restart: always
    ports:
    - "5432:5432"
    environment:
      POSTGRES_USER: prisma
      POSTGRES_PASSWORD: ${PRISMA_DB_PASSWORD}
      TZ: ${PRISMA_DB_TIME_ZONE}
    volumes:
      - postgres:/var/lib/postgresql/data
volumes:
   prisma:
   postgres:

Если порт 5432 в вашем хозяин — это уже используется, и если вы хотите вместо этого использовать 3306, вы можете выполнить переадресацию портов, как показано ниже:

  postgres:
    image: postgres:10.3
    restart: always
    ports:
    - "3306:5432"
    environment:
      POSTGRES_USER: prisma
      POSTGRES_PASSWORD: ${PRISMA_DB_PASSWORD}
      TZ: ${PRISMA_DB_TIME_ZONE}
    volumes:
      - postgres:/var/lib/postgresql/data

ОБНОВЛЕНИЕ - 1

Причина, по которой prisma может получить доступ к postgres

Раздел порты предназначен только для того, чтобы сделать наши услуги доступными на уровне хозяин. Но на уровне контейнера, если порт открыт в контейнере, любой другой работающий контейнер может получить доступ к этому порту с помощью раздела сети или ссылки.

По умолчанию docker-compose создает сеть для каждого файла docker-compose.yml и объединяет все службы в этом файле в эту сеть.

По этой причине мы могли бы использовать <service name> в качестве имени хоста, а compose разрешит это имя в IP-адрес соответствующего (в вашем случае постгрес) контейнера.

Спасибо.! подключение к базе данных работает сейчас. но как призма подключилась к контейнеру postgre с моими настройками docker-compose.yml? Я использовал 3306:3306, я мог создавать новые узлы, и все манипуляции с данными через игровую площадку prisma успешно сохранялись в postgres.

Dulara Malindu 22.05.2019 12:33

Раздел порты предназначен только для того, чтобы сделать наши услуги доступными на уровне хозяин. Но на уровне контейнера, если порт открыт в контейнере, любой другой запущенный контейнер может получить доступ к этому порту с помощью раздела сети или ссылки. По умолчанию docker-compose создает сеть для каждого файла docker-compose.yml и объединяет все службы в этом файле в эту сеть. По этой причине мы могли бы использовать <service name> в качестве имени хоста, а compose разрешит это имя в IP-адрес соответствующего (в вашем случае постгрес) контейнера.

Thilak 23.05.2019 06:26

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