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".
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
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
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
- Open
http://yourhost:8082and 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. - 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.sockinstead. - 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.
- 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" - Bookmark
/logs/<container-id>for the services you debug often. Dozzle remembers a live tail per container.
4 — Reduce the noise
# 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)
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.