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

  1. Click the split view icon (top right)
  2. Select multiple containers
  3. 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:

l}ogs.ryeovuerrdsoem_apirno.xcyomlo{calhost:8888

With sub-path:

y}ourdh}oamnadilrnee._vcpeoarmtshe{_/plroogxsy/*lo{calhost:8888

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

FeatureDozzlePortainerLoki+GrafanaSeq
PurposeLog viewerFull mgmtLog aggregationLog search
Setup time30 seconds2 minutes30 minutes10 minutes
RAM usage~10MB~100MB~500MB+~200MB
Stores logs
SearchReal-timeBasicAdvancedAdvanced
Multi-host
FreePartialPartial

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-file and local drivers (default)
  • Won’t work with syslog, journald, or none drivers

High CPU usage

  • Usually caused by containers producing extremely verbose logs
  • Set DOZZLE_LEVEL=warn to 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

MetricUsage
RAM~10-15MB
CPUNegligible
Disk0 (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.