Questa è la seconda parte di una serie in due parti su come lavorare con i contenitori Docker. Nella prima parte, ci siamo concentrati sui molti modi e opzioni per eseguire un'immagine e su come l'host può interagire con un contenitore Docker.
In questa parte, tratteremo l'elenco, l'avvio, l'arresto e il riavvio dei contenitori nonché l'esecuzione di comandi sui contenitori in esecuzione. In particolare, imparerai la differenza tra contenitori in esecuzione e bloccati (usciti) e come controllare con precisione le informazioni e mostrarle quando elimini i contenitori filtrando e formattando.
Quindi, avrai esperienza pratica di arresto, avvio, riavvio e collegamento ai contenitori. Infine, eseguirai comandi one-off e otterrai l'accesso alla shell interattiva a un contenitore in esecuzione.
Prima di iniziare, assicurati che Docker sia installato correttamente nel tuo ambiente. A seconda di come è installato e dell'utente, potrebbe essere necessario eseguirlo come sudo. Salterò il sudo.
Quando si lavora con i contenitori, spesso si desidera elencare, visualizzare e filtrare i contenitori. Il docker ps
comando è la chiave e ha diverse opzioni interessanti.
Il comando più elementare è chiaro docker ps
senza argomenti, che mostra tutti i contenitori attualmente in esecuzione.
$ docker ps ID CONTENITORE IMMAGINE COMANDO CREATO STATO PORTO NOMI 2f542e1cb88b nginx "nginx -g 'demone ..." 12 ore fa Fino 12 ore 443 / tcp, 0.0.0.0:9000->80/tcp nginx
Ottieni molte informazioni su ogni contenitore, incluso l'id del contenitore, l'immagine, il comando, quando è stato creato, il suo stato corrente, le sue porte e i suoi nomi. È un po 'difficile da analizzare a causa del wrapping. Vedremo in seguito come filtrare e formattare l'output. Si noti che il comando viene troncato (così come l'id del contenitore). Per mostrare il comando completo, aggiungere --no-trunc
:
$ docker ps --no-trunc IMAGE COMMAND nginx "nginx -g" daemon off; ""
Ora, il comando completo è visibile: nginx -g 'daemon off;'
Come ricordi, Docker mantiene fermati i contenitori (a meno che non li abbiate eseguiti con --rm
). Aggiunta -un
mostra tutti i contenitori:
$ docker ps -a ID CONTENENTE DATI STATUS IMMAGINE cc797c61dc21 busybox Uscita busybox 67f3cb5a9647 busybox Uscito ecstatic_jones 898fb562e535 ciao-mondo Exited hopeful_spence 6dd210fda2d8 ciao-mondo Creato infallible_curie 2f542e1cb88b nginx Fino 12 ore nginx
L'output di docker ps
può essere troppo prolisso e spesso mostra molti campi che non sono interessanti. Puoi utilizzare la formattazione del modello Go per visualizzare solo i campi che ti interessano. Qui vengono visualizzati solo il nome e il comando:
$ docker ps --no-trunc --format '.Names \ t . Command' nginx "nginx -g 'daemon off;'"
Funziona, ma per presentarlo con i nomi dei campi, aggiungi "table" all'inizio della stringa di formato:
$ docker ps -a --no-trunc --format 'table .Names \ t . Command' NAMES COMMAND busybox "cat /data/1.txt" ecstatic_jones "cat / data / 1. txt "hopeful_spence" / hello "infallible_curie" ls -la "nginx" nginx -g 'daemon off;' "
Il nome del formato per l'id contenitore (non selezionato qui) è .ID
(tutto maiuscolo).
Il docker ps
comando supporta molti filtri. Sono abbastanza semplici da usare. La sintassi è -f "
. I filtri supportati sono id, label, name, exited, status, ancestor, before, since, isolation, network e health.
Qui è il filtro per nome del contenitore e mostra solo il contenitore busybox:
$ docker ps -a -f "name = busybox" \ --format 'table .ID \ t . Status \ t . Names' CONTAINER ID STATUS ID cc797c61dc21 Uscito (0) 11 minuti fa busybox
Se tutto ciò che vuoi è l'id del contenitore, usa il -q bandiera
(bandiera tranquilla). È più semplice di --formatta 'table .ID'
. Questo è spesso necessario quando vuoi eseguire operazioni su più contenitori (vedrai un esempio più tardi).
$ docker ps -aq cc797c61dc21 67f3cb5a9647 898fb562e535 6dd210fda2d8 2f542e1cb88b
È possibile interrompere l'esecuzione di contenitori e avviare un contenitore interrotto. Esistono diverse differenze tra l'avvio di un contenitore bloccato e l'esecuzione di una nuova istanza della stessa immagine:
Fermiamo il nginx contenitore e quindi avviarlo. Quando fai riferimento a un contenitore, puoi usare il suo nome o un prefisso non ambiguo del suo id. Di solito nomino i miei contenitori di lunga durata, quindi ho un handle significativo e non devo occuparmi dei prefissi degli id dei container o dei nomi generati automaticamente da Docker.
$ docker stop nginx nginx $ docker ps -a -f "nome = nginx" --format 'table .Names \ t . Status' NAMES STATUS nginx Uscito (0) 2 minuti fa
OK. Nginx viene arrestato (lo stato è "Chiuso"). Iniziamo:
$ finestra di avvio nginx nginx $ docker ps -a -f "nome = nginx" --format 'table .Names \ t . Status' NAMES STATUS nginx Su 33 secondi
Il riavvio di un contenitore in esecuzione è un'altra opzione, che è equivalente a fermata docker
seguito da inizio finestra mobile
.
$ docker restart nginx
nginx $ docker ps -a -f "name = nginx" --format 'table .Names \ t . Status' NAMES STATUS nginx Fino 2 secondi
Quando si avvia un container arrestato o se si è eseguito il contenitore in modalità indipendente (-d
argomento della riga di comando), non è possibile vedere l'output. Ma puoi attaccarti ad esso.
$ docker attach nginx 172.17.0.1 - - [19 / Mar / 2017: 08: 40: 03 +0000] "HEAD / HTTP / 1.1" 200 0 "-" "HTTPie / 0.8.0" "-"
È possibile rimuovere i contenitori arrestati con il comando: docker rm
$ docker rm ecstatic_jones ecstatic_jones
Se si desidera rimuovere un container in esecuzione, è possibile interromperlo o utilizzare il -f
(forza) argomento della riga di comando:
$ docker rm -nginx Risposta di errore da demone: non è possibile rimuovere un contenitore in esecuzione 3dbffa955f906e427298fbeb3eadfd229d64365dd880c9771a31b0aedb879d6d. Arresta il contenitore prima di provare a rimuovere o utilizzare -f $ finestra mobile rm -f -nginx nginx
Se vuoi rimuovere tutti i contenitori, ecco un bel frammento:
finestra mobile rm -f $ (finestra mobile ps -aq)
Se si desidera rimuovere solo il contenitore interrotto, rimuovere il -f
(forza) bandiera.
Docker esegue un singolo processo all'interno di un contenitore, ma è possibile eseguire comandi aggiuntivi su un contenitore in esecuzione. È molto simile a fornire un comando personalizzato al run docker
comando, tranne che in questo caso è in esecuzione parallelamente al comando run.
L'esecuzione di un semplice comando avviene tramite docker exec
. Fornisci un ID contenitore o nome in esecuzione e il comando che desideri eseguire. Diamo un'occhiata al nginx.conf file all'interno del nginx contenitore e vedere quanti processi di lavoro sono configurati.
$ docker exec nginx cat /etc/nginx/nginx.conf | grep worker_processes worker_processes 1;
Una delle migliori tecniche di risoluzione dei problemi con i contenitori Docker è quella di connettersi a una shell interattiva e di esplorare il file system interno. Al fine di allegare stdin e avere un tty, è necessario fornire il -io -t
argomenti della riga di comando (possono essere raggruppati come -esso
) e quindi il nome di un eseguibile shell (di solito bash).
Finisci con l'accesso alla shell al tuo contenitore. Ecco un esempio di controllo interattivo dei processi di lavoro da "dentro" al contenitore.
$ docker exec -it nginx bash root @ b010e854bb98: / # cat /etc/nginx/nginx.conf | grep worker_processes worker_processes 1; root @ b010e854bb98: / #
Docker è una piattaforma potente, e dal momento che il contenitore è la sua unità di lavoro, fornisce molti strumenti per gestire e lavorare con i contenitori. Ho descritto la maggior parte degli aspetti importanti del lavoro con i contenitori, ma ci sono molte più funzionalità avanzate, opzioni e sfumature per i comandi che ho trattato, oltre ad alcuni comandi aggiuntivi.
Se lavori a stretto contatto con i contenitori Docker, prenditi il tempo per immergerti e imparare tutto su di loro. Pagherà profumatamente.