Running a bunch of Docker containers but hate switching between docker logs commands? Dozzle gives you a beautiful, real-time web UI to view logs from all your containers in one place. No database, no agents, no configuration — just deploy and go.
Why Dozzle?
- Zero config — point it at Docker and it works
- Real-time streaming — logs appear instantly, no polling
- Multi-container view — watch several containers side by side
- Search and filter — find what you need fast
- No storage — doesn’t store logs (uses Docker’s own log driver)
- Tiny footprint — ~10MB RAM, single binary
- Multi-host — monitor remote Docker hosts from one dashboard
- Dark mode — easy on the eyes during late-night debugging
Prerequisites
- Docker and Docker Compose
- That’s it. Seriously.
Step 1: Deploy Dozzle
Create docker-compose.yml:
services:
dozzle:
image: amir20/dozzle:latest
container_name: dozzle
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
ports:
- "8888:8080"
environment:
- DOZZLE_LEVEL=info
- DOZZLE_TAILSIZE=300
restart: unless-stopped
docker compose up -d
Open http://your-server-ip:8888 — you’ll immediately see all running containers with live logs.
Step 2: Basic Usage
View Container Logs
Click any container name in the sidebar. Logs stream in real-time with color-coded output.
Multi-Container View
- Click the split view icon (top right)
- Select multiple containers
- Watch logs from different services side by side — perfect for debugging request flows across services
Search Logs
- Use the search bar to filter log lines in real-time
- Supports regex:
error|warn|fail - Case-insensitive by default
Filter by Log Level
Dozzle auto-detects log levels. Click the level badges to filter:
- 🔴 Error
- 🟡 Warning
- 🟢 Info
- ⚪ Debug
Step 3: Authentication
By default Dozzle has no auth. For production use, add simple authentication:
Option 1: Built-in Auth
Create a users.yml file:
users:
admin:
password: "$2y$10$..." # bcrypt hash
email: [email protected]
Generate the password hash:
docker run --rm amir20/dozzle generate admin --password your-password
Update compose:
services:
dozzle:
image: amir20/dozzle:latest
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./users.yml:/data/users.yml
ports:
- "8888:8080"
environment:
- DOZZLE_AUTH_PROVIDER=simple
Option 2: Reverse Proxy Auth
If you’re already using Authelia, Authentik, or basic auth on your reverse proxy, let that handle authentication and keep Dozzle internal-only.
Step 4: Monitor Remote Docker Hosts
Dozzle can aggregate logs from multiple servers:
Via TCP Socket
On the remote host, expose Docker’s TCP socket (use TLS in production):
# On remote host - /etc/docker/daemon.json
{
"hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"]
}
In your Dozzle compose:
environment:
- DOZZLE_REMOTE_HOST=tcp://192.168.1.100:2375|server2,tcp://192.168.1.101:2375|server3
Via SSH Agent (Safer)
environment:
- DOZZLE_REMOTE_HOST=ssh://[email protected]|server2
volumes:
- ~/.ssh:/root/.ssh:ro
Now you’ll see containers from all hosts in one dashboard, labeled by server name.
Step 5: Customize Appearance
environment:
# Number of log lines to load initially
- DOZZLE_TAILSIZE=500
# Minimum log level to display
- DOZZLE_LEVEL=info
# Custom base path (for reverse proxy sub-path)
- DOZZLE_BASE=/logs
# Enable container stats (CPU/memory alongside logs)
- DOZZLE_ENABLE_ACTIONS=true
Step 6: Reverse Proxy Setup
Caddy:
With sub-path:
Set DOZZLE_BASE=/logs when using sub-paths.
Step 7: Container Labels
Organize containers with Docker labels that Dozzle recognizes:
# In your other service compose files
services:
myapp:
image: myapp:latest
labels:
- "dozzle.group=production"
- "dozzle.name=My Application"
Containers appear grouped and labeled in the Dozzle sidebar.
Dozzle vs Alternatives
| Feature | Dozzle | Portainer | Loki+Grafana | Seq |
|---|---|---|---|---|
| Purpose | Log viewer | Full mgmt | Log aggregation | Log search |
| Setup time | 30 seconds | 2 minutes | 30 minutes | 10 minutes |
| RAM usage | ~10MB | ~100MB | ~500MB+ | ~200MB |
| Stores logs | ❌ | ❌ | ✅ | ✅ |
| Search | Real-time | Basic | Advanced | Advanced |
| Multi-host | ✅ | ✅ | ✅ | ✅ |
| Free | ✅ | Partial | ✅ | Partial |
When to use Dozzle: You want instant log visibility with zero overhead. When to use Loki: You need log retention, alerting, and complex queries.
Troubleshooting
No containers showing
- Check Docker socket mount:
ls -la /var/run/docker.sock - Verify permissions: the Dozzle container needs read access to the socket
- Try adding
user: "0"to the compose if permission denied
Logs not streaming
- Check container logging driver:
docker inspect --format='{{.HostConfig.LogConfig.Type}}' container-name - Dozzle works with
json-fileandlocaldrivers (default) - Won’t work with
syslog,journald, ornonedrivers
High CPU usage
- Usually caused by containers producing extremely verbose logs
- Set
DOZZLE_LEVEL=warnto filter out noise - Fix the noisy container’s log verbosity at the source
Remote host connection fails
- Verify network connectivity between hosts
- Check firewall rules (port 2375 for TCP, 22 for SSH)
- For TLS: ensure certificates are properly mounted
Resource Usage
| Metric | Usage |
|---|---|
| RAM | ~10-15MB |
| CPU | Negligible |
| Disk | 0 (no storage) |
| Image size | ~30MB |
Dozzle is one of the lightest self-hosted tools you can run.
Conclusion
Dozzle does one thing and does it perfectly: it shows you Docker logs in real-time through a clean web interface. No configuration, no database, no overhead.
If you’re running any Docker containers at all, Dozzle should be one of the first things you deploy. It takes 30 seconds to set up and immediately makes your entire stack more observable. There’s no reason not to run it.