Stack components
| Service | Port | Role |
|---|---|---|
| Prometheus | 9090 | Scrape & store metrics |
| Grafana | 3000 | Dashboards & alerts |
| Loki | 3100 | Log aggregation |
Docker Compose
├── prometheus
├── grafana
└── loki
Install Docker & Compose (Ubuntu)
sudo apt update
sudo apt install -y docker.io docker-compose-v2
sudo systemctl enable --now docker
sudo usermod -aG docker $USER
# re-login, then:
docker --version
docker compose versionProject layout
mkdir -p ~/monitoring/prometheus
cd ~/monitoringprometheus/prometheus.yml
global:
scrape_interval: 15s
scrape_configs:
- job_name: "prometheus"
static_configs:
- targets: ["localhost:9090"]docker-compose.yml
version: "3.8"
services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
restart: unless-stopped
ports:
- "9090:9090"
volumes:
- ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus_data:/prometheus
networks:
- monitoring
grafana:
image: grafana/grafana:latest
container_name: grafana
restart: unless-stopped
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_USER=admin
- GF_SECURITY_ADMIN_PASSWORD=admin123
volumes:
- grafana_data:/var/lib/grafana
depends_on:
- prometheus
- loki
networks:
- monitoring
loki:
image: grafana/loki:latest
container_name: loki
restart: unless-stopped
ports:
- "3100:3100"
command: -config.file=/etc/loki/local-config.yaml
networks:
- monitoring
volumes:
prometheus_data:
grafana_data:
networks:
monitoring:Start & verify
docker compose up -d
docker compose ps
docker compose logs -f prometheus| URL | Purpose |
|---|---|
http://<host>:9090 | Prometheus UI |
http://<host>:3000 | Grafana (admin / admin123) |
http://<host>:3100/ready | Loki health |
Open security group ports 3000 and 9090 only as needed for your lab IP.
Change the Grafana password immediately. Do not expose Grafana publicly without auth hardening.