Проблема с подключением приложения Django к базе данных PostgreSQL, запущенной в контейнере Docker

В настоящее время я работаю над проектом Django, в котором я использую виртуальную среду (venv) для запуска Django локально на моей машине (Windows). Кроме того, у меня есть база данных PostgreSQL, запущенная в контейнере Docker.

У меня возникли проблемы при попытке установить соединение между моим приложением Django и базой данных PostgreSQL. Всякий раз, когда я пытаюсь запустить python manage.py makemigrations, я получаю следующую ошибку:

RuntimeWarning: Got an error checking a consistent migration history performed for database connection 'default': connection to server at "host.docker.internal" (141.31.78.207), port 5432 failed: Connection timed out (0x0000274C/10060)
        Is the server running on that host and accepting TCP/IP connections?

  warnings.warn(
No changes detected

Вот соответствующие части моего файла Django settings.py:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'SilverSurfer',
        'USER': 'postgres',
        'PASSWORD': "root",
        'HOST': "host.docker.internal",
        'PORT': '5432',
    }
}

А вот мой файл Docker Compose:

version: "3.9"

services:
  db:
    image: postgres:15.0
    environment:
      POSTGRES_DB: SilverSurfer
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: root
    ports:
      - "5432:5432"
    volumes:
      - ./db.sql:/docker-entrypoint-initdb.d/db.sql

Стоит отметить, что мой Docker-контейнер для базы данных запущен:

CONTAINER ID   IMAGE           COMMAND                  CREATED          STATUS          
528ad4e3232f   postgres:15.0   "docker-entrypoint.s…"   37 minutes ago   Up 37 minutes   
PORTS                    NAMES
0.0.0.0:5432->5432/tcp   02_db-db-1

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

Может ли кто-нибудь помочь мне в устранении этой проблемы? Любые соображения или предложения будут очень признательны. Заранее благодарю!

Я также экспериментировал с альтернативными именами хостов, такими как "localhost", "0.0.0.0", и даже с моим локальным IP-адресом, полученным из ipconfig ("172.16.98.1"). Я столкнулся с аналогичными ошибками таймаута.

Изначально я планировал иметь два отдельных Docker-контейнера - один для Django, другой для PostgreSQL. Однако я столкнулся с трудностями при установлении связи между контейнером Django и контейнером PostgreSQL. Такая настройка также привела к проблемам с соединением, не позволяя Django подключиться к базе данных PostgreSQL в другом Docker-контейнере. С двумя Docker-контейнерами я также попытался создать сеть и указать имя контейнера Postgre в настройках Django DB, но и это не помогло.

Вы подключаетесь с хост-машины к контейнеру докера. Вам не нужно (и не следует) использовать адрес host.docker.internal.

        'HOST': "host.docker.internal",

Поскольку вы уже публикуете порт,

    ports:
      - "5432:5432"

в этом случае достаточно использовать localhost или 127.0.0.1 в качестве HOST.

        'HOST': "localhost",

Обратите внимание, что если впоследствии вы измените код приложения на контейнер и запустите его из того же файла compose, то правильным хостом будет db (имя сервиса для базы данных).

Нажмите Win + I, чтобы открыть системные настройки. В меню выберите Сеть и Интернет. В следующем окне выберите Состояние на левой панели.

Нажмите Изменить параметры адаптера, чтобы открыть инструмент Сетевые подключения.

Ethernet or WiFI > Properties > IPv4 Address of your machine.

enter image description here

или

Наберите ipconfig /all в CMD и нажмите Enter. Это покажет всю информацию о вашем сетевом адаптере: Физический адрес: Это MAC-адрес вашего сетевого адаптера. DHCP Enabled: Указывает, использует ли сетевое подключение DHCP или статический IP-адрес. enter image description here

используйте это IP:PORT(DB) Eg 192.168.1.111:5432 для соединения с БД postgres

Вернуться на верх