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

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