QUICK: Ja mam stejny setup (Django, Postgres a Elastic) a pouzivam to bez dockeru protoze mi to prislo jednodussi, jak to delam ja:
* docker pull
* pip install -r requirements.txt
* migrate/collectstatic/...
* restart gunicorn
Postgres i Elastic (take jeden node, kdyz neni potreba vic, tak je za nej zbytecne platit, nikoho zabijet nebudu :) ) mam na cloudu protoze to nechci resit (RDS a Elastic Cloud). Celkovy naklady na provoz jsou hluboko pod $100 mesicne na AWS (t4g.micro, t2.micro RDS a 1 node na elastic cloudu, mame ale zatim maly traffic).
Pokud uz to mas dockerizovany tak bych doporucil:
* nahrat novou image s novou verzi aplikace
* pustit docker
* idealne pustit nejaky smoke test
* prepnout nginx aby ukazoval na novy docker
* zabit stary docker
Budes to mit uplne bezvypadkove pokud ti to logika dovoli - nekde budes muset prizpusobit jak delas napriklad migrace aby sli delat tak, ze stara verze bude moct stale mluvit s novou DB.