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