Il debug della maggior parte dei programmi Linux di solito comporta il controllo dei file di registro, che può essere un processo complesso. Tuttavia, durante l'esecuzione in un ambiente containerizzato in Docker, dovrai utilizzare strumenti più specifici per eseguire il debug delle app in produzione.
Dove vengono archiviati i log?
La semplice risposta è che Docker archivia i log dei container nella sua posizione di archiviazione principale, /var/lib/docker/
. Ogni container ha un log specifico per il suo ID (l'ID completo, non quello abbreviato che viene solitamente visualizzato) e puoi accedervi in questo modo:
/var/lib/docker/containers/ID/ID-json.log
Ecco dove sono archiviati, ma poiché sono in formato JSON, non sono facilmente leggibili e dover utilizzare l'ID contenitore completo è fastidioso. Docker fornisce un comando integrato per visualizzarli:
docker logs -f e4bd48ef3103
Qui, il -f
flag manterrà il prompt aperto e "seguirà" tutte le nuove voci nel file. Puoi anche --tail
il file, oppure usa --timestamps
per visualizzare l'ora del registro, oppure usa --until
e --since
per filtrare in base al tempo.
Se stai utilizzando Docker Compose, puoi utilizzare il comando log da esso per visualizzare facilmente tutti i registri:
docker-compose logs
Tuttavia, una cosa che noterai è che questo è STDOUT e STDERR, che è utile per molte cose, ma mostra solo l'output della console del punto di ingresso specificato da "CMD" nel file Docker. Molte app hanno i propri sistemi di registrazione dedicati, che spesso accedono a file come /var/log/nginx/access.log
. L'accesso a log come questo è ancora possibile dal lato host tramite Docker.
Visualizzazione dei log dalle app all'interno dei container
A seconda del contenitore, questo potrebbe non essere necessario. Ad esempio, il contenitore NGINX predefinito è impostato per inviare i suoi registri Docker a STDOUT per semplificare il controllo dei registri. Lo fa con un collegamento simbolico da /dev/stdout
nel file di registro e puoi impostare qualcosa di simile per i tuoi contenitori.
RUN ln -sf /dev/stdout /var/log/nginx/access.log && ln -sf /dev/stderr /var/log/nginx/error.log
Tuttavia, se desideri controllare file specifici all'interno di un contenitore, puoi farlo. Docker fornisce exec -it
comando per consentire di eseguire qualsiasi comando all'interno di qualsiasi processo Docker in esecuzione. Usando questo, puoi accodare un file di registro all'interno di un contenitore Docker:
docker exec -it e4bd48ef3103 tail -f log.txt
Poiché ciò ti consente di eseguire qualsiasi comando, puoi utilizzare journalctl
o qualsiasi altra strategia di debug che desideri, a condizione che venga premessa con docker exec -it
. Puoi persino eseguire /bin/bash
se vuoi saltare e dare un'occhiata.
Una soluzione più permanente che funziona meglio con i servizi host consiste nell'usare un montaggio del volume Docker. Puoi associare una directory come /var/log/nginx
a un volume visibile dall'host. Innanzitutto, crea un nuovo volume:
docker volume create nginx-logs
Ed esegui il container con --mount
:
docker run -d --name devtest --mount source=nginx-logs,target=/var/log/nginx nginx:latest
Se utilizzi Docker Compose, il processo può essere automatizzato:
version: "3.0" services: web: image: nginx:latest ports: - "80:80" volumes: - nginx-logs:/var/log/nginx/ volumes: nginx-logs:
In questo modo, i file di registro saranno direttamente ingeribili da qualsiasi servizio di aggregazione dei registri sulla macchina host.
Visualizzazione dei registri di Docker Daemon
Se invece desideri visualizzare i log specifici per il servizio Docker generale sul tuo server e non qualsiasi app containerizzata specifica, ti consigliamo di visualizzare il journalctl
registri:
sudo journalctl -fu docker.service
Qui è dove è memorizzato sulla maggior parte dei sistemi, ma in alcuni si trova in una posizione diversa:
- Amazon Linux:
/var/log/docker
- CentOS/RHEL:
/var/log/messages | grep docker
- macOS:
~/Library/Containers/com.docker.docker/Data/log/vm/dockerd.log
- Windows:
AppDataRoamingDockerlogvmdockerd.log