Generally speaking, in a production environment, you don't want things like Nginx and your database running in Docker containers. You want those services running on the host and your application(s) in a container.
The tricky part here is that
localhost in a container is the container's network, not the host's. So
postgres://user@localhost:5432/somedatabase won't work.
Lots of solution online suggest using IP ranges or setting
network=host so that Docker uses the host network.
The best solution is to use volumes. The great think about Linux is pretty much everything is a file. So if something has a port, it probably has a socket.
So then your docker-compose.yml file can just look like this:
services: web: image: organisation/image-name ports: - "8000:8000" volumes: - /var/run/postgresql/:/var/run/postgresql/
Then away you go. For a Django app, you just set
HOST="/var/run/postgresql" in your settings file.