Django не может подключиться к запущенному контейнеру докеров postgres

#django #linux #postgresql #docker #docker-compose

Вопрос:

Я удивлен, что не могу заставить это работать, так как я несколько раз запускал приложения django с базой данных postgres в контейнерах docker, однако на этот раз на моей машине Linux приложение django не может подключиться к контейнеру postgres docker, тогда как на моем Mac установка работает без проблем.

Я получаю стандартную ошибку:

django.db.utils.Ошибка операции: не удалось подключиться к серверу: Хост недоступен Сервер работает на хосте «postgresdb» (172.27.0.2) и принимает соединения TCP/IP на порту 5432?

Контейнер postgres запущен и должен быть доступен. Я проверяю IP-адрес контейнера docker, и он кажется правильным. Мой файл docker-compose выглядит следующим образом:

 version: "3.8"
services:
  app:
    container_name: data-management
    restart: always
    build: ./
    ports:
      - '3000:3000'
    links:
      - 'postgresdb'
    volumes:
      - ./:/usr/local/share/src/app
    env_file:
      - .dev.env

  postgresdb:
    container_name: be-postgres
    restart: always
    image: postgres:13.4-alpine
    ports:
      - '5432:5432'
    volumes:
      - postgres-db:/var/lib/postgresql/data
    env_file:
      - .dev.env

volumes:
  postgres-db:
 

Конфигурации хранятся в файле среды, который используется в обоих контейнерах, чтобы избежать любых несоответствий.

 POSTGRES_PASSWORD=devpassword123
POSTGRES_USER=devuser
POSTGRES_SERVICE=postgresdb
POSTGRES_PORT=5432
POSTGRES_DB=data_management
 

Настройки базы данных django настолько стандартны, насколько это возможно:

 DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'HOST': os.environ['POSTGRES_SERVICE'],
        'NAME': os.environ['POSTGRES_DB'],
        'PORT': os.environ['POSTGRES_PORT'],
        'USER': os.environ['POSTGRES_USER'],
        'PASSWORD': os.environ['POSTGRES_PASSWORD'],
    }
}
 

У меня нет идей о том, что может быть причиной этого, так как это происходит только на моей машине Fedora, и при работе на моем Mac проблем нет. В прошлом у меня уже были проблемы с SELinux с некоторыми томами docker, однако после поиска в Google я не смог найти никаких предположений о том, что SELinux снова может быть виновником.

Комментарии:

1. Что-нибудь в журналах контейнеров Postgres указывает на то, что он работает неправильно?

2. Брандмауэр блокирует порт? Ты можешь это сделать psql -d <db_name> -p 5432 -h 172.27.0.2 -U <some_user> ? Что listen_addresses установлено в postgresql.conf ? Добавьте ответы в качестве обновления к вопросу.

3. К сожалению, в журналах postgres нет никаких проблем. @AdrianKlaver при выполнении команды в контейнере postgres я могу успешно подключиться к базе данных

4. Это в значительной степени само собой разумеется. Что вам нужно сделать, так это попытаться подключиться извне контейнера, так как именно в этом и заключается проблема. Когда вы добавите полную команду, которую вы используете, и результат к вашему вопросу. Также, пожалуйста, ответьте на другие вопросы, которые я задавал в качестве обновлений к вашему вопросу.

5. Спасибо всем за добавление комментариев! Проблема действительно заключалась в брандмауэре, как упоминал @AdrianKlaver. Fedora изменилась с iptables на nftables , и это нарушило внутреннюю связь с контейнером. Изменив его, чтобы iptables решить проблему, однако, я не уверен, что это решение является лучшим.