Как настроить динамически, без compose, несколько докер-контейнеров django с контейнерами postgres для каждого домена на лету
Как быть с созданием нескольких докер-контейнеров django и связанных с ними докер-контейнеров postgresql для N доменов.
У меня есть локальный dnsserver, имитирующий производственный, и я настроил разрешение *.test.com и test.com указывать на мой 127.0.0.1
Я создал сетевой мост docker для всех контейнеров docker, работающих под этим проектом, чтобы я мог связаться с ними по имени docker.
Итак, когда клиент/арендатор регистрируется в системе, скажем, в компании "mycomp", я создаю django docker-контейнер под названием mycomp_web, он доступен по адресу mycomp.test.com, Ngnix анализирует домен и сопоставляет revers_proxy для поиска django-контейнера mycomp_web. Это работает хорошо. Но теперь мне нужно переключиться с sqlite на postgresql. Поэтому мне нужно также создать контейнер postgresql для каждого домена. Таким образом, это будет что-то вроде mycomp_db.
Теперь главный вопрос: как мне указать моему экземпляру django на нужный контейнер postgres (используя имя этого контейнера). До этого я использовал имена докеров для поиска контейнеров.
Как установить запись о базе данных в settings.py из django
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'erp',
'USER': 'erp_user',
'PASSWORD': '123',
'HOST': '127.0.0.1',
'PORT': '5432',
}
Как изменить HOST
и PORT
, чтобы найти докер-контейнер postgres, соответствующий этому домену?
Так что если я зарегистрирую новый домен, например mycomp2, у меня будет mycomp2_web (контейнер django и mycomp2_db (контейнер postgresql)), и контейнер django сможет найти контейнер postgres, принадлежащий этому домену.
Надеюсь, это имеет смысл.
Спасибо
Как отметил Ричард в комментариях, в качестве имени хоста в settings.py
следует просто использовать имя контейнера соответствующего контейнера postgres, т.е. для mycomp2_web
:
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'erp',
'USER': 'erp_user',
'PASSWORD': '123',
'HOST': 'mycomp2_db',
'PORT': '5432',
}
mycomp2_db
будет преобразован во внутренний IP-адрес контейнера postgres с помощью внутреннего DNS докера. На этом IP-адресе процесс postgres будет слушать всегда один и тот же порт - поэтому нет необходимости изменять его динамически.
В соответствии с вашим комментарием, вы пытались всегда выставлять порт контейнеров базы данных на хост - что для нескольких хостов потребовало бы разных случайно назначенных портов. Но вам не нужно открывать порты хосту в первую очередь, и вы можете просто использовать внутренний IP-адрес контейнера - который также можно легко решить, просто используя имя хоста контейнера, как описано выше.