Как поддерживать связь между контейнерами Docker, когда один из них подключен к хост-машине?

В настоящее время я развертываю приложение с помощью Docker (версия 27.2.1), используя docker compose на debian 11.

Мой файл docker-compose.yml состоит из определения 4 контейнеров (app, api, db и ngninx). app и api - это приложения Django. db - это сервис postgresql.

Весь контейнер развернут на машине, на которой размещен SMTP-сервис на порту 25. Мое Django-приложение app должно использовать этот сервис для отправки писем пользователям, но оно также должно иметь возможность соединяться с другими контейнерами. Например, db является хостом сервера postgresql, который содержит все данные, управляемые моделями Django, определенными в app.

Я не могу найти, как мои контейнеры могут находиться в одной сети и при этом иметь службу app по отношению к хост-машине. Это не позволяет мне использовать SMTP, который мне нужен. Из того, что я прочитал на этом сайте и в документации, кажется, что невозможно иметь службу, работающую как в network_mode=host, так и в сети моста по умолчанию.

Вот docker-compose.yml файл.

services:
  app:
    build: ./app
    depends_on:
      db:
        condition: service_healthy
    ports:
      - "8080:8080"
    volumes:
      ...
    extra_hosts:
      - "host.docker.internal:host-gateway"
      
  api:
    build: ./api
    depends_on:
      db:
        condition: service_healthy    
    ports:
      - "8081:8081"
    volumes:
      ...

  db:
    build: ./db
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U user-h localhost -d database"]
      interval: 5s
      timeout: 5s
      retries: 5

  nginx:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      ...
    depends_on:
      - app
      - api

volumes:
  ...

Когда я узнаю, как успешно подключиться к хост-машине, я изменю свою settings.py на правильную EMAIL_HOST.

Я перепробовал несколько вариантов.

Во-первых, я добавил это упоминание в app-часть docker-compose файла:

extra_hosts:
      - "host.docker.internal:host-gateway"

Но когда я захожу в контейнер приложений и пытаюсь, например, telnet host.docker.internal 25, соединение отклоняется.

Я попытался напрямую привязать порт хост-машины к порту контейнера приложений. При использовании этой конфигурации и выполнении команды telnet <ip_address_of_host> 25 соединение устанавливается, но сразу же закрывается посторонним хостом.

Другие варианты, которые я пробовал до сих пор, не жизнеспособны, так как они использовали одновременно режим хоста и сети.

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