Self-Host Dozzle: Real-Time Docker Log Viewer 2026
TL;DR
Dozzle (MIT, ~6K GitHub stars, Go) is a real-time Docker log viewer with a clean web UI. Point it at your Docker socket and instantly stream, search, and filter logs from all containers — no agents, no databases, no configuration. Datadog Log Management costs $0.10/GB ingested; Dozzle is free with zero storage overhead because it reads directly from Docker's log driver.
Key Takeaways
- Dozzle: MIT, ~6K stars, Go — real-time Docker log viewer in the browser
- Zero config: Mount Docker socket → done — no database, no storage, no agents
- Multi-host: Connect to remote Docker hosts to view all logs in one UI
- Log streaming: Real-time tailing with auto-scroll, pause, and search
- Filtering: Regex search, container name filter, log level highlighting
- Tiny footprint: ~10MB RAM, single binary — runs anywhere Docker runs
Part 1: Docker Setup
# docker-compose.yml
services:
dozzle:
image: amir20/dozzle:latest
container_name: dozzle
restart: unless-stopped
ports:
- "8080:8080"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
environment:
# Optional: set base path for reverse proxy:
# DOZZLE_BASE: /logs
# Optional: filter containers:
# DOZZLE_FILTER: "status=running"
# Optional: enable authentication:
# DOZZLE_AUTH_PROVIDER: simple
docker compose up -d
Visit http://your-server:8080 — immediately see all running containers and their logs.
Part 2: HTTPS with Caddy
logs.yourdomain.com {
reverse_proxy localhost:8080
}
Part 3: Authentication
Simple auth (username/password)
services:
dozzle:
image: amir20/dozzle:latest
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./users.yml:/data/users.yml:ro
environment:
DOZZLE_AUTH_PROVIDER: simple
# users.yml
users:
admin:
name: "Admin"
# Generate: echo -n 'password' | shasum -a 256
password: "5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8"
email: admin@yourdomain.com
viewer:
name: "Viewer"
password: "..."
email: viewer@yourdomain.com
# Generate password hash:
echo -n 'your-password' | shasum -a 256 | cut -d' ' -f1
Forward auth (Authentik/Authelia)
If you're already using Authentik or Authelia:
logs.yourdomain.com {
forward_auth authelia:9091 {
uri /api/verify?rd=https://auth.yourdomain.com
copy_headers Remote-User Remote-Groups
}
reverse_proxy dozzle:8080
}
Part 4: Multi-Host Setup
View logs from multiple Docker hosts in a single Dozzle instance.
Remote agent setup
On each remote host, deploy the Dozzle agent:
# On remote-host-1 docker-compose.yml:
services:
dozzle-agent:
image: amir20/dozzle:latest
container_name: dozzle-agent
restart: unless-stopped
command: agent
ports:
- "7007:7007"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
Connect from the main Dozzle instance
# On your main server:
services:
dozzle:
image: amir20/dozzle:latest
ports:
- "8080:8080"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
environment:
DOZZLE_REMOTE_HOST: >-
tcp://remote-host-1:7007|Host-1,
tcp://remote-host-2:7007|Host-2
Now all containers from all hosts appear in the sidebar, grouped by host.
Part 5: Log Features
Real-time streaming
- Logs auto-scroll as new entries arrive
- Click Pause to stop auto-scroll and inspect historical entries
- Click Resume to jump back to live tailing
Search and filter
# Type in the search bar:
ERROR — find error messages
"connection refused" — exact phrase match
level=error — structured log fields
500|502|503 — regex: any of these status codes
Log level highlighting
Dozzle automatically detects and color-codes log levels:
- 🔴 ERROR, FATAL, PANIC
- 🟡 WARN, WARNING
- 🟢 INFO
- 🔵 DEBUG, TRACE
Container grouping
Containers from docker-compose projects are automatically grouped together under the project name.
Part 6: Container Actions
Beyond just viewing logs, Dozzle shows:
- Container info: Image, ports, volumes, environment variables, networks
- CPU/Memory charts: Real-time resource usage per container
- Log download: Download logs as a text file
- Multiple containers: View logs from multiple containers side-by-side
Merged log view
Select multiple containers → Merged view to see interleaved logs from related services (e.g., web app + database + cache) in chronological order.
Part 7: Configuration Options
environment:
# Timezone:
TZ: America/Los_Angeles
# Filter which containers are shown:
DOZZLE_FILTER: "status=running"
# Or by label:
DOZZLE_FILTER: "label=logging=true"
# Tail size (how many lines to load initially):
DOZZLE_TAILSIZE: 300
# Custom base path (for reverse proxy subpath):
DOZZLE_BASE: /logs
# Disable analytics:
DOZZLE_NO_ANALYTICS: "true"
# Hide specific containers:
# Add label to container: dozzle.ignore=true
Hide containers via labels
# On containers you don't want in Dozzle:
services:
internal-service:
image: myimage
labels:
dozzle.ignore: "true"
Part 8: Docker Compose Integration
Run Dozzle alongside all your other services:
# Your existing docker-compose.yml:
services:
webapp:
image: myapp:latest
labels:
dozzle.group: "production"
database:
image: postgres:16
labels:
dozzle.group: "production"
redis:
image: redis:7
labels:
dozzle.group: "production"
dozzle:
image: amir20/dozzle:latest
ports:
- "8080:8080"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
Maintenance
# Update:
docker compose pull dozzle
docker compose up -d dozzle
# No backup needed — Dozzle is stateless
# It reads logs directly from Docker, stores nothing
# Check resource usage (should be minimal):
docker stats dozzle --no-stream
# Logs:
docker compose logs -f dozzle
See all open source DevOps tools at OSSAlt.com/categories/devops.