Kituwa IT · Self-hosting guides

Install Dozzle with Docker Compose

Self-hosted Docker log viewer

logstaildebugging

Dozzle is a log viewer for Docker. It watches the Docker event stream, shows every container's stdout and stderr in a searchable web UI, and lets you follow multiple containers at once. It's the answer to "what was that container saying at 3am".

Category
Monitoring
License
MIT
Needs
Docker socket + labels
Image
amir20/dozzle

What it is

It doesn't store anything — it tails the Docker log stream live, so there's no database to grow and no index to build. Search, filters, per-container views, and a compose label that puts your services into groups with a couple of lines of YAML.

Before you start

  • Log lines can contain secrets. Treat Dozzle as sensitive: put it behind auth rather than leaving it open on the tailnet or a public host.
  • It only sees Docker's log stream. Systemd services, journald, and syslog need a separate tool or a syslog forwarder into a container that logs to stdout.
  • Modern Compose adds com.docker.compose.* labels automatically, which is how Dozzle discovers containers without a config file at all.

1 — Write the compose file

Command / configuration
services:
  dozzle:
    image: amir20/dozzle:latest
    container_name: dozzle
    restart: unless-stopped
    ports:
      - "127.0.0.1:8082:8080"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./data:/data
    environment:
      DOZZLE_AUTH_PROVIDER: simple
      DOZZLE_AUTH_USERNAME: admin
      DOZZLE_AUTH_PASSWORD: CHANGE_ME
      DOZZLE_BASE: /
      DOZZLE_NO_ANALYTICS: "true"
      DOZZLE_LOG_LEVEL: info

2 — Start it

Command / configuration
mkdir -p ~/services/dozzle/data
cd ~/services/dozzle
docker compose up -d
docker compose logs -f dozzle | grep -i "listening\|error"

3 — First-run setup

  1. Open http://yourhost:8082 and log in. The simple provider above is a single shared account — fine for a home server, and worth replacing with an OIDC provider if you already run one.
  2. Confirm containers appear. If the list is empty, the socket mount is wrong or you're on a rootless Docker install, where the socket lives in $XDG_RUNTIME_DIR/docker.sock instead.
  3. Turn on the log levels you care about in the UI filter, and use the search box across all containers at once. Cross-container search is the feature that pays for the app.
  4. Add the compose labels to group things. Drop this into any service's compose file to place it in a Dozzle group: labels: - "dev.dozzle.enable=true" - "dev.dozzle.name=Infrastructure" - "dev.dozzle.groups=core"
  5. Bookmark /logs/<container-id> for the services you debug often. Dozzle remembers a live tail per container.

4 — Reduce the noise

Command / configuration
# cap log size per container so disk doesn't fill
services:
  nextcloud:
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"

# what dozzle is actually showing, per container
docker inspect --format '{{.Name}} {{.HostConfig.LogConfig.Type}}' $(docker ps -q)
Logs are only useful until they're fullDocker's default json-file driver with no rotation will fill a disk given a noisy application. Adding the logging block above to every service is ten minutes of work that prevents the kind of outage where a full disk takes down Postgres and therefore everything that depends on it.

Help when you need it

Want help getting this running?

We can help with a supported Linux host, application setup, migration or troubleshooting. Contact us to confirm the software, scope and scheduling before ordering.

Related guides

← Browse all 30 guides · Back to top