The Four Pieces Every Stack Needs
A functional observability stack, regardless of vendor, needs four components talking to each other: a way to receive telemetry (the OTel Collector), somewhere to store it (an analytical database), an API layer to query it, and a UI to actually look at it. Docker Compose is a natural fit for wiring these together locally or on a single VM, since each component is just a container with a defined port and a shared network.
A Minimal docker-compose.yml Shape
version: "3.8"
services:
otel-collector:
image: otel/opentelemetry-collector-contrib:latest
volumes:
- ./otel-config.yaml:/etc/otelcol/config.yaml
ports:
- "4317:4317"
- "4318:4318"
networks: [otel-net]
storage:
image: your-analytics-db:latest
volumes:
- db-data:/var/lib/storage
networks: [otel-net]
api:
image: your-observability-api:latest
depends_on: [storage]
ports:
- "8000:8000"
networks: [otel-net]
frontend:
image: your-observability-frontend:latest
depends_on: [api]
ports:
- "3000:3000"
networks: [otel-net]
networks:
otel-net:
volumes:
db-data:
The key structural point is the shared otel-net network — every component needs to reach
the others by service name, and the Collector specifically needs its config mounted in so you can adjust
receivers and exporters without rebuilding the image. See our
Collector configuration guide for what goes in that
file.
Why One-Command Installers Matter
Hand-writing this file from scratch is a reasonable learning exercise, but for actually getting a stack running, a maintained installer script that generates the Compose file, pulls the right image versions, and starts everything in the correct dependency order saves real time — and avoids subtle version mismatches between components that are easy to introduce by hand.
bash -c "$(curl -fsSL \
https://raw.githubusercontent.com/xplurdata/oss-stack/main/install.sh)"
What Changes Moving to Production
A local Compose setup is fine for evaluation, but a few things typically change for a real deployment: persistent volumes need to live on properly backed-up storage, the storage tier often moves to a multi-node cluster rather than a single container, and the Collector configuration usually gains batching, sampling, and retry policies tuned to actual traffic rather than defaults. None of this changes the Compose file's basic shape — it's still the same four pieces, just sized and configured for production load.
Conclusion
Docker Compose is a legitimate way to run observability infrastructure, not just a toy for local development — plenty of small and mid-size teams run their entire stack this way indefinitely. Start with the four-component shape above, and grow individual pieces (storage, mainly) as your telemetry volume demands it.
Deploy the Full Stack in One Command
XplurData's installer configures Doris, the OTel Collector, and the app server automatically.
Deploy XplurData