Hai mai avuto bisogno di vedere cosa succede all’interno di un contenitore Docker? I contenitori sono progettati per essere idempotenti: se c’è un problema, rilancia un nuovo contenitore. Spesso la vita non è così semplice. È necessario eseguire comandi nel contenitore per identificare il problema. È qui che il comando docker exec
può essere utile.
Questo articolo ti insegnerà come eseguire comandi su un contenitore Docker in esecuzione usando il comando docker exec
.
Prerequisiti
Per seguire gli esempi in questo articolo, è necessario attenersi ai seguenti requisiti.
- Qualsiasi versione recente di Docker Desktop funzionerà su Windows, Linux o macOS. Questo tutorial utilizza la versione 3.1.0 in esecuzione su Windows 10.
Avviare un contenitore NGINX
Docker exec
esegue comandi nei contenitori. Ma, per fare ciò, devi prima avere un contenitore in cui eseguire quei comandi. Iniziamo scaricando un’immagine Docker e creando un contenitore demo.
- Crea una nuova directory, questo tutorial utilizza C:\gitrepos\test, per contenere i file utilizzati per il contenitore.
2. Creare un file chiamato dockerfile (senza estensione), contenente il seguente codice. Il Dockerfile definisce i passaggi necessari per creare un container.
3. Successivamente, creare un file, nella stessa directory, chiamato index.html che contiene il seguente codice. Questo è un file HTML che, quando il container viene avviato, mostrerà un messaggio di Hello World.
4. Ora creare il container Docker di Nginx. Poiché il Dockerfile si trova nella directory di lavoro corrente, specificare .
per far sapere al motore Docker di cercare lì. Assicurarsi inoltre di contrassegnare il container con my-nginx
utilizzando il parametro t
per facilitare il riferimento futuro.

5. Ora che il container è stato creato, avviare il container con il comando Docker run.

6. Infine, aprire il browser web e navigare su http://localhost/
per visualizzare quanto segue.

Esecuzione di comandi con Docker Exec
Quando si eseguono comandi in un container Docker, potrebbe essere necessario eseguirli interattivamente. L’esecuzione interattiva implica l’inserimento di un comando, ricevere feedback, inserire un altro comando, ecc. I comandi interattivi prendono il controllo della sessione e impediscono di fare qualsiasi altra cosa.
Ma se si conoscono già i comandi da inviare al container in anticipo e si desidera eseguire comandi in background, è possibile eseguire comandi non interattivi. I comandi non interattivi consentono di inviare un comando a Docker e restituire immediatamente il controllo della console.
Trovare il Nome e l’ID del Container
Ora che hai costruito il container, puoi eseguire comandi al suo interno. Prima di eseguire un comando, individua il nome o l’ID del container NGINX. Sia il nome che l’ID funzioneranno nei comandi Docker. Tieni presente che ricordare l’ID potrebbe essere più difficile rispetto al nome!
Per visualizzare le informazioni su qualsiasi container in esecuzione, esegui il comando Docker ps
per ottenere le seguenti informazioni.

Copia l’ID univoco, e17e4b6be01a
, o il nome generato casualmente mystifying_chandrasekhar
negli appunti per un uso successivo.
Esecuzione di un Comando Non Interattivo con Docker Exec
Come esempio di esecuzione di un comando non interattivo, copia e esegui il comando sottostante per restituire un elenco di file nella directory /var/log con il comando ls -l
. Passa tutto dopo il nome del container, mystifying_chandrasekhar
, al comando Docker exec
.

Avoidare l’output della console con i comandi Docker
Restituendo immediatamente il controllo della shell all’utente, le operazioni di grandi dimensioni evitano di bloccare la console. Omettere l’output della console con l’opzione d
distaccata. Il comando sottostante crea il file /tmp/execWorks tramite il comando touch
all’interno del contenitore e non mostra alcun output sulla console.
Eseguire comandi interattivi con Docker Exec
Fino a questo punto, hai imparato come eseguire comandi non interattivi in un contenitore Docker con docker exec
. Ma potresti trovarsi di fronte a un momento in cui devi risolvere i problemi di un contenitore, ad esempio, quando è necessario impartire comandi al contenitore in modo interattivo. In tal caso, è necessario eseguire comandi in modo interattivo.
Eseguire comandi in modo interattivo con docker exec
richiede due opzioni, i
e t
. L’opzione i
mantiene aperto STDIN, consentendo l’invio di comandi al contenitore, e l’opzione t
alloca un pseudo-TTY (PTY), un canale di comunicazione, per digitare comandi.
Copia e incolla il seguente comando per aprire un prompt dei comandi interattivo al contenitore Docker in esecuzione con la shell Bourne (sh), come indicato dal cambio del prompt a / #
.

Una volta nella shell, esegui ora i comandi sottostanti per dimostrare l’elenco dei file da all’interno del contenitore. Infine, esegui il comando exit
per lasciare la shell interattiva.

Per aprire un prompt interattivo in una directory specifica, passa il percorso all’opzione
w
indicando a Docker di avviare la shell in una directory specificata.
Passaggio di Variabili Ambientali a un Container in Esecuzione
Molti programmi utilizzano le variabili ambientali per impostare configurazioni all’avvio. Ad esempio, la maggior parte delle applicazioni Java richiede che la variabile ambientale JAVA_HOME
sia impostata sul percorso di Java.
Puoi passare le variabili ambientali a una sessione utilizzando l’opzione e
. Ad esempio, forse devi popolare una variabile ambientale chiamata MYVAR
in un container in esecuzione. Per farlo, utilizza l’opzione e
e fornisci la coppia chiave/valore di MYVAR="<some value>"
come mostrato di seguito.

Passaggio delle Variabili Ambientali Con un File
Se hai molte variabili ambientali o una configurazione condivisa, memorizzare tali variabili in un file potrebbe essere più semplice. Passa il file tramite un percorso relativo o assoluto a Docker con l’opzione --env-file
. Questa tecnica viene spesso utilizzata per fornire credenziali sicure a un container. Assicurati di non inserire mai credenziali nel controllo delle versioni!
Crea un file di testo chiamato env-vars.txt
con le variabili ambientali da passare e i loro valori. Questo file può essere chiamato come preferisci e non ha bisogno dell’estensione del file .txt
.

Passa le variabili ambientali a Docker con l’opzione env-file
. Verifica che le variabili siano disponibili con il comando echo
come mostrato nella schermata sottostante.

Interagire con un container in esecuzione come un utente diverso
In produzione, le applicazioni spesso vengono eseguite come utente specifico per limitarne l’accesso. Se si eseguono applicazioni come utente specifico in produzione, si dovrebbe fare lo stesso durante il test dei comandi.
In questo esempio, il container Docker viene eseguito come utente nginx
. Passare l’utente all’opzione w
per dire a Docker di avviare il container come account nginx
. Il comando whoami
, eseguito all’interno del container, conferma che l’utente nginx
viene effettivamente utilizzato.

nginx
user.Passaggi successivi
Hai imparato come eseguire comandi all’interno di un container in esecuzione utilizzando il comando docker exec
. Utilizzando il comando exec
per accedere e interrogare i container in esecuzione, hai uno strumento potente nel tuo arsenale per risolvere i problemi dei container Docker.
Ora prova a portare ciò che hai imparato un passo più avanti e usa il controllo di versione Git per tirare un sito web statico nel container, anziché copiare un singolo file. Se Git è nuovo per te, allora l’articolo Guida per principianti a Visual Studio Code e Git è un ottimo punto di partenza.