docker-compose.yml gives the whole stack a single declaration. Each service has an image (or build context), volumes, environment, depends_on, and a healthcheck. Bind-mount the source folder so a host edit live-reloads in containers. Use a single one-liner to start it all.
db: pgvector/pgvector:pg15 (extension pre-installed).
web + worker: bind mount .:/app for hot reload, separate processes.
frontend: Streamlit on 8501, talks to web via http://web:8000.
worker ignores healthcheck (no HTTP port).
docker compose up
db -> web <- frontend
\
worker (Celery)
One docker-compose.yml replaces 5 README sections. Ship a working dev env in seconds.