
Dozzle è un log viewer per container Docker leggero e in tempo reale pensato per essere l’alternativa pratica al classico docker logs -f lanciato a mano su ogni container.
È stateless (non salva nulla su disco), pesa pochi MB e si installa con un solo comando Docker.
Nelle versioni più recenti supporta anche query SQL sui log tramite DuckDB in-browser monitoraggio multi-host con agent dedicati e notifiche verso Slack, Discord, ntfy o webhook generici.
In questa guida vedremo come installarlo su Ubuntu 26.04 con configurazione tramite Docker Compose, persistenza dei dati, autenticazione e pubblicazione dietro reverse proxy con certificato TLS.
PREREQUISITI
- Un server Ubuntu 26.04 con accesso sudo
- Docker Engine (versione 19.03 o superiore, API 1.40+) e il plugin Docker Compose
- Un container già in esecuzione, giusto per avere qualche log da guardare
INSTALLAZIONE DI DOCKER
Se Docker non è ancora installato eseguire i comandi:
|
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
sudo apt update
sudo apt install -y ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
sudo usermod -aG docker $USER
|
Dopo l’ultimo comando, esci e rientra nella sessione SSH (o esegui newgrp docker) per usare Docker senza sudo.
CREAZIONE DELLA DIRECTORY DELLO STACK
Come per gli altri servizi self-hosted conviene tenere ogni stack in una cartella dedicata sotto /opt:
|
0
1
2
|
sudo mkdir -p /opt/stacks/dozzle
cd /opt/stacks/dozzle
|
CREAZIONE DEL DOCKER-COMPOSE.YML
Creare il file docker-compose.yml con il comando:
|
0 |
sudo nano docker-compose.yml
|
Contenuto minimo, con persistenza del volume /data (necessaria per non perdere le impostazioni di notifica tra un riavvio e l’altro del container):
|
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
services:
dozzle:
image: amir20/dozzle:latest
container_name: dozzle
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- dozzle_data:/data
ports:
- "8080:8080"
environment:
- DOZZLE_HOSTNAME=dozzle-srv01
# - DOZZLE_ENABLE_ACTIONS=true # abilita start/stop/restart dei container dalla UI
# - DOZZLE_ENABLE_SHELL=true # abilita l'accesso alla shell dei container dalla UI
# - DOZZLE_AUTH_PROVIDER=simple # abilita l'autenticazione (vedi Passo 5)
volumes:
dozzle_data:
|
NOTA BENE: il flag :ro sul mount del socket Docker perchè Dozzle ha bisogno solo di leggere lo stato dei container e i log, quindi montarlo in sola lettura è una buona pratica anche se, va detto, l’accesso al socket Docker resta comunque equivalente a un accesso root sull’host.
AVVIO DEL CONTAINER
Avviare il Container con il comando:
|
0 |
docker compose up -d
|
Dovremmo visualizzare un output simile al seguente:
|
0
1
2
3
4
|
[+] up 9/9
✔ Image amir20/dozzle:latest Pulled 3.1s
✔ Network dozzle_default Created 0.0s
✔ Volume dozzle_dozzle_data Created 0.0s
✔ Container dozzle Started
|
Fare un check con il comando:
|
0 |
docker ps | grep dozzle
|
Dovremmo visualizzare un output simile al seguente:
|
0 |
d7c03c6a3fb8 amir20/dozzle:latest "/dozzle" 33 seconds ago Up 31 seconds 0.0.0.0:8080->8080/tcp, [::]:8080->8080/tcp dozzle
|
Verificare che sia raggiungibile il link con il comando:
|
0 |
curl -I http://localhost:8080
|
ACCESSO A DOZZLE DA WEBGUI
Se tutto è a posto da un qualsiasi browser richiamare il link http://IP-DEL-SERVER:8080
Se è tutto OK dovremmo visualizzare la dashboard con l’elenco dei container in esecuzione sull’host.
CONFIGURAZIONE DEL FIREWALL
Se si vuole esporre la porta solo sulla rete interna limitare la regola alla subnet invece di aprirla su 0.0.0.0 con il comando:
|
0 |
sudo ufw allow from 192.168.0.0/16 to any port 8080 proto tcp
|
Se invece si pubblica Dozzle dietro reverse proxy la porta 8080 non deve essere esposta pubblicamente: basta che sia raggiungibile dal proxy.
ABILITARE L’AUTENTICAZIONE SU DOOZLE
Di default Dozzle è senza autenticazione quindi chiunque raggiunge la porta vede i log di tutti i container.
Per qualsiasi esposizione oltre al semplice localhost va abilitata l’autenticazione con il comando:
|
0
1
2
3
|
docker run -it --rm -v dozzle_data:/data amir20/dozzle generate admin \
--password "PASSWORD_SICURA" \
--email admin@lab.prv \
--name "Admin"
|
Poi nel docker-compose.yml scommentare la seguente riga:
|
0
1
|
yaml environment:
- DOZZLE_AUTH_PROVIDER=simple
|
Quindi riavviare lo stack con il comando:
|
0 |
docker compose up -d
|
Da questo momento l’accesso alla UI richiederà la login.
MONITORAGGIO MULTI-HOST (OPZIONALE)
Se si hanno più host Docker da monitorare da un’unica dashboard Dozzle supporta un’architettura ad agent: su ogni host remoto lanci un agent leggero, e li colleghi tutti al Dozzle principale.
Su ogni host remoto eseguire i comandi:
|
0
1
2
3
4
5
|
docker run -d \
--name dozzle-agent \
--restart unless-stopped \
-v /var/run/docker.sock:/var/run/docker.sock:ro \
-p 7007:7007 \
amir20/dozzle:latest agent
|
Sul Dozzle principale aggiungere nel docker-compose.yml le seguenti righe:
|
0
1
|
environment:
- DOZZLE_REMOTE_AGENT=IP_HOST_REMOTO:7007
|
L’agent comunica via gRPC sulla porta 7007: verificare che sia raggiungibile prima di dare per scontato che non funzioni.
FUNZIONALITA’ DI DOOZER
Ecco un quadro completo delle funzionalità di Dozzle, con pro e contro di ciascuna:
Monitoraggio log in tempo reale
Streaming live dei log di tutti i container Docker, senza bisogno di aprire terminali multipli con docker logs -f.
Pro: zero configurazione, log visibili immediatamente all’avvio
Contro: nessuna persistenza se un container va giù, vedi solo quello che rimane nel buffer del log driver Docker (limitato da max-size in daemon.json)
Ricerca e filtri sui log
Supporta ricerca regex, fuzzy search e (nelle versioni recenti) query SQL complete tramite DuckDB, eseguite via WebAssembly direttamente nel browser.
Pro: ricerca potente senza bisogno di un backend esterno o database
Contro: la ricerca SQL funziona solo sui log attualmente in buffer/visibili, non su uno storico persistente non è un sostituto di Loki o ELK per ricerche su settimane di log
Statistiche container (CPU, memoria, rete)
Grafici con storico “rolling” delle risorse per ogni container, aggiornati in tempo reale.
Pro: utile per un colpo d’occhio rapido senza aprire docker stats o Portainer
Contro: storico limitato alla sessione, non pensato per capacity planning a lungo termine
Multi-container / split view
Visualizzazione affiancata dei log di più container contemporaneamente.
Pro: comodo per debug su stack con più servizi correlati (es. app + db + reverse proxy)
Contro: con molti container aperti insieme l’interfaccia diventa affollata
Azioni sui container (start/stop/restart, shell)
Da abilitare esplicitamente con DOZZLE_ENABLE_ACTIONS e DOZZLE_ENABLE_SHELL.
Pro: gestione rapida senza uscire dal browser
Contro: disattivate di default per motivi di sicurezza — abilitarle su un’istanza esposta pubblicamente amplia parecchio la superficie di rischio, dato che chi ha accesso può eseguire comandi nei container
Notifiche/alert su pattern di log
Match su espressioni configurabili con notifica verso Slack, Discord, ntfy o webhook generico.
Pro: permette un minimo di alerting reattivo senza integrare uno stack di observability completo
Contro: nessuna gestione di stato/silenziamento evoluta come in un vero sistema di alerting (Alertmanager, ecc.)
Multi-host e Swarm/Kubernetes
Architettura ad agent per collegare più host Docker o cluster Swarm da un’unica dashboard; supporto anche per Kubernetes (DOZZLE_MODE=k8s, con RBAC per accesso ai log dei pod).
Pro: scala bene per contesti MSP con più host da monitorare centralmente
Contro: richiede di esporre/raggiungere la porta 7007 (gRPC) dell’agent su ogni host remoto, quindi va pianificato bene su reti segmentate o dietro VPN/tunnel
Autenticazione
Provider “simple” con utenti generati via CLI, oppure integrazione con reverse proxy di autenticazione tipo Authelia.
Pro: copre il caso base senza bisogno di terze parti
Contro: disattivata di default è facile dimenticarsene e lasciare un’istanza aperta su una rete condivisa; nessun supporto nativo a RBAC granulare (es. utenti che vedono solo certi container)
Impronta e leggerezza
Immagine da 7-10 MB, footprint minimo di CPU/RAM, nessun database.
Pro: ideale per homelab o affiancato ad app leggere senza overhead percepibile
Contro: proprio perché stateless, non fa retention: non è adatto a compliance/audit log a lungo termine
Accesso al socket Docker
Richiede il mount di /var/run/docker.sock (idealmente in sola lettura, :ro).
Pro: nessuna configurazione aggiuntiva per “vedere” tutti i container
Contro: l’accesso al socket Docker è di fatto equivalente a un accesso root sull’host è il principale motivo per cui va protetto dietro autenticazione/reverse proxy e mai esposto direttamente su internet
Analytics anonime
Raccoglie dati anonimi di utilizzo (Google Analytics) per orientare lo sviluppo, disattivabile col flag –no-analytics.
Pro: aiuta il progetto (open source, non finanziato) a capire dove investire
Contro: va disattivato esplicitamente se in ambienti con policy privacy stringenti (es. NIS2, clienti regolamentati)
In sintesi Dozzle è ottimo come vista live leggera e immediata, ma non sostituisce una piattaforma di log management vera e propria quando servono retention, ricerca storica, alerting strutturato o controlli di accesso granulari lì restano scelte più adatte Loki+Grafana, ELK o soluzioni a pagamento tipo Dash0.

0 commenti