Проблема с подключением приложения 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.
или
Наберите ipconfig /all
в CMD и нажмите Enter. Это покажет всю информацию о вашем сетевом адаптере: Физический адрес: Это MAC-адрес вашего сетевого адаптера. DHCP Enabled: Указывает, использует ли сетевое подключение DHCP или статический IP-адрес.
используйте это IP:PORT(DB) Eg 192.168.1.111:5432
для соединения с БД postgres