Как поддерживать связь между контейнерами 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 соединение устанавливается, но сразу же закрывается посторонним хостом.
Другие варианты, которые я пробовал до сих пор, не жизнеспособны, так как они использовали одновременно режим хоста и сети.