Docker
Debug di un contenitore
Ricerca…
Sintassi
- statistiche docker [OPZIONI] [CONTENITORE ...]
- log del docker [OPZIONI] CONTENITORE
- finestra mobile [OPZIONI] CONTENITORE [ps OPZIONI]
Entrare in un contenitore funzionante
Per eseguire operazioni in un contenitore, utilizzare il comando docker exec
. A volte questo è chiamato "entrare nel contenitore" poiché tutti i comandi sono eseguiti all'interno del contenitore.
docker exec -it container_id bash
o
docker exec -it container_id /bin/sh
E ora hai una shell nel tuo contenitore funzionante. Ad esempio, elenca i file in una directory e lascia il contenitore:
docker exec container_id ls -la
È possibile utilizzare il -u flag
per immettere il contenitore con un utente specifico, ad esempio, uid=1013
, gid=1023
.
docker exec -it -u 1013:1023 container_id ls -la
L'uid e il gid non devono esistere nel contenitore ma il comando può causare errori. Se si desidera avviare un contenitore e accedere immediatamente al fine di controllare qualcosa, è possibile farlo
docker run...; docker exec -it $(docker ps -lq) bash
il comando docker ps -lq
restituisce solo l'id dell'ultimo (il contenitore l in -lq
) avviato. (questo suppone che tu abbia bash come interprete disponibile nel tuo contenitore, potresti avere sh o zsh o qualsiasi altro)
Monitorare l'utilizzo delle risorse
Ispezionare l'utilizzo delle risorse di sistema è un modo efficace per trovare applicazioni che presentano un comportamento anomalo. Questo esempio è equivalente al comando top
tradizionale per i contenitori:
docker stats
Per seguire le statistiche di contenitori specifici, elencali sulla riga di comando:
docker stats 7786807d8084 7786807d8085
Le statistiche Docker mostrano le seguenti informazioni:
CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O
7786807d8084 0.65% 1.33 GB / 3.95 GB 33.67% 142.2 MB / 57.79 MB 46.32 MB / 0 B
Per impostazione predefinita, le docker stats
visualizzano l'id dei contenitori, e questo non è molto utile, se preferisci visualizzare i nomi del container, basta fare
docker stats $(docker ps --format '{{.Names}}')
Monitoraggio dei processi in un contenitore
Ispezionare l'utilizzo delle risorse di sistema è un modo efficace per limitare un problema su un'applicazione live. Questo esempio è un equivalente del comando tradizionale ps
per contenitori.
docker top 7786807d8084
Per filtrare il formato dell'output, aggiungi le opzioni ps
sulla riga di comando:
docker top 7786807d8084 faux
Oppure, per ottenere l'elenco dei processi in esecuzione come root, che è una pratica potenzialmente dannosa:
docker top 7786807d8084 -u root
Il comando docker top
risulta particolarmente utile quando si risolvono i problemi di contenitori minimalistici senza shell o il comando ps
.
Allegare a un contenitore in esecuzione
'Allegare a un contenitore' è l'atto di avviare una sessione terminale all'interno del contesto in cui è in esecuzione il contenitore (e tutti i programmi in esso contenuti). Questo è principalmente usato per scopi di debug, ma potrebbe anche essere necessario se dati specifici devono essere passati a programmi in esecuzione all'interno del contenitore.
Il comando attach
è utilizzato per fare questo. Ha questa sintassi:
docker attach <container>
<container>
può essere l'id del contenitore o il nome del contenitore. Per esempio:
docker attach c8a9cf1a1fa8
O:
docker attach graceful_hopper
Potrebbe essere necessario sudo
i comandi di cui sopra, a seconda del vostro utente e come finestra mobile è impostato.
Nota: Collega consente solo una sessione di shell singola da collegare a un contenitore alla volta.
Attenzione: tutti gli input da tastiera verranno inoltrati al contenitore. Colpire Ctrl-c ucciderà il tuo contenitore.
Per staccare da un contenitore collegato, premere successivamente Ctrl-p e poi Ctrl-q
Per collegare più sessioni di shell a un contenitore o semplicemente come alternativa, è possibile utilizzare exec
. Utilizzando l'id del contenitore:
docker exec -i -t c8a9cf1a1fa8 /bin/bash
Usando il nome del contenitore:
docker exec -i -t graceful_hopper /bin/bash
exec
eseguirà un programma all'interno di un contenitore, in questo caso /bin/bash
(una shell, presumibilmente una che ha il contenitore). -i
indica una sessione interattiva, mentre -t
alloca uno pseudo-TTY.
Nota: Diversamente dal collegamento , premendo Ctrl-c si termina il comando exec 'd solo quando viene eseguito in modo interattivo.
Stampa dei registri
Seguire i registri è il modo meno intrusivo per eseguire il debug di un'applicazione live. Questo esempio riproduce il comportamento della tail -f some-application.log
tradizionale tail -f some-application.log
sul contenitore 7786807d8084
.
docker logs --follow --tail 10 7786807d8084
Questo comando mostra fondamentalmente l'output standard del processo contenitore (il processo con pid 1).
Se i tuoi log non includono in modo nativo il timestamping, puoi aggiungere il flag --timestamps
.
È possibile anche guardare i log di un container fermo
avvia il contenitore
docker run ... ; docker logs $(docker ps -lq)
con ladocker run ... ; docker logs $(docker ps -lq)
trova l'ID contenitore o il nome con
docker ps -a
e poi
docker logs container-id
o
docker logs containername
come è possibile guardare i registri di un container fermo
Debugging del processo contenitore Docker
Docker è solo un modo elegante per eseguire un processo, non una macchina virtuale. Pertanto, il debug di un processo "in un contenitore" è anche possibile "sull'host" semplicemente esaminando il processo del contenitore in esecuzione come utente con le autorizzazioni appropriate per ispezionare quei processi sull'host (ad es. Root). Ad esempio, è possibile elencare ogni "processo contenitore" sull'host eseguendo un semplice ps
come root:
sudo ps aux
Tutti i contenitori Docker attualmente in esecuzione saranno elencati nell'output.
Questo può essere utile durante lo sviluppo dell'applicazione per il debug di un processo in esecuzione in un contenitore. Come utente con autorizzazioni appropriate, è possibile utilizzare utility di debug tipiche nel processo contenitore, come strace, ltrace, gdb, ecc.