Есть два варианта:
1. Если нагрузка небольшая, можно использовать Daphne и для WSGI, и для ASGI запросов;
2. Передавать контейнерам режим работы через environment variables (использовать entrypoint script, который будет запускать manage.py runserver, uwsgi, gunicorn, daphne, или manage.py runworker в зависимости от выбранного режима), запросы распределять между контейнерами в зависимости от пути или доменного имени.
"По классике" статику отдаёт не Nginx, а S3 - AWS или его аналоги в проде, Minio в dev окружениях.
Вместо Nginx советую использовать Traefik - он умеет находить контейнеры и роутить запросы к ним в зависимости от параметров, указанных в docker-compose.yml. Автоматический load balancing, letsencrypt без лишних телодвижений, очень просто конфигурируется, может обслуживать несколько разных проектов без дополнительных настроек (актуально для фрилансеров).
#!/bin/sh
set -o errexit
set -o pipefail
set -o nounset
if [ $DJANGO_DEBUG == "on" ]; then
./manage.py runserver 0.0.0.0:8000
elif [ $DJANGO_MODE == "worker" ]; then
./manage.py runworker
else
daphne -b 0.0.0.0 -p 8000 config.asgi:application
fi