Hai mai avuto bisogno di vedere cosa sta succedendo all'interno di un container Docker? I contenitori devono essere idempotenti:in caso di problemi, ridistribuire un nuovo contenitore. Spesso la vita non è così semplice. È necessario eseguire i comandi nel contenitore per identificare il problema. Qui è dove il docker exec
il comando può aiutare.
Questo articolo ti insegnerà come eseguire comandi su un contenitore Docker in esecuzione utilizzando docker exec
comando.
Prerequisiti
Per seguire gli esempi in questo articolo, dovrai attenerti a quanto segue.
- Qualsiasi versione recente di Docker Desktop funzionerà su Windows, Linux o macOS. Questo tutorial utilizza la v3.1.0 in esecuzione su Windows 10.
Avvio di un container NGINX
Docker exec
esegue i comandi nei contenitori. Ma, per farlo, devi prima avere un container in cui eseguire quei comandi. Iniziamo scaricando un'immagine Docker e creando un container demo.
- Crea una nuova directory, questo tutorial usa C:\gitrepos\test , per contenere i file utilizzati per il contenitore.
2. Creare un file, denominato dockerfile (senza estensione), contenente il codice seguente. Il Dockerfile definisce i passaggi necessari per creare un contenitore.
FROM nginx:alpine
COPY index.html /usr/share/nginx/html/index.html
3. Quindi, crea un file, nella stessa directory, chiamato index.html che contiene il seguente codice. Questo è un file HTML che, all'avvio del contenitore, visualizzerà un messaggio Hello World.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Hello World - Nginx Docker</title>
<style>
h1{ font-weight:lighter; font-family: Arial, Helvetica, sans-serif;
}
</style>
</head>
<body>
<h1>
Hello World
</h1>
</body>
</html>
4. Ora crea il contenitore Nginx Docker. Poiché il Dockerfile si trova nella directory di lavoro corrente, specifica .
per far sapere al motore Docker di guardare lì. Inoltre, assicurati di taggare il contenitore con my-ngnix
usando il t
parametro per garantire una più facile consultazione in futuro.
docker build -t my-nginx .
5. Ora che il contenitore è stato creato, avvia il contenitore con il comando Docker run.
# rm - Informs Docker to delete the container after it has stopped
# d - Return control of the command-line after the command has been executed
# p - Map the internal container port 80 to an external port 80 docker run --rm -d -p 80:80 my-nginx
6. Infine, apri il tuo browser web e vai a http://localhost/
per vedere quanto segue.
Esecuzione di comandi con Docker Exec
Quando si eseguono comandi in un contenitore Docker, potrebbe essere necessario eseguire un comando in modo interattivo. Eseguire comandi in modo interattivo significa digitare un comando, ricevere feedback, digitare un altro comando, ecc. I comandi interattivi prendono il controllo della tua sessione e ti impediscono di fare qualsiasi altra cosa.
Ma cosa succede se si conoscono già i comandi da inviare al container in anticipo e si desidera eseguire comandi in background? In tal caso, puoi eseguire comandi non interattivi. I comandi non interattivi ti consentono di inviare un comando a Docker e di restituire immediatamente il controllo della console.
Individuazione del nome e dell'ID del contenitore
Ora che hai creato il contenitore, puoi eseguire i comandi all'interno del contenitore. Prima di eseguire un comando, individua il nome o l'ID del contenitore NGINX. Il nome o l'ID funzioneranno nei comandi Docker. Con questo in mente, ricordare l'ID potrebbe essere più difficile del nome!
Per visualizzare qualsiasi informazione sul contenitore in esecuzione, esegui la finestra mobile ps
comando per produrre le seguenti informazioni.
docker ps
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 ed esegui il comando seguente per restituire un elenco di file in /var/log directory con ls -l
comando. Passa tutto dopo il nome del contenitore, mystifying_chandrasekhar
, nella finestra mobile exec
comando.
docker exec mystifying_chandrasekhar ls -l /var/log
Evitare l'output della console con i comandi Docker
Restituendo istantaneamente il controllo della shell all'utente, le operazioni di grandi dimensioni evitano di vincolare la console. Rinuncia all'output della console con il d
separato opzione. Il comando seguente crea il file /tmp/execWorks tramite il touch
comando all'interno del contenitore e non visualizza alcun output sulla console.
docker exec -d mystifying_chandrasekhar touch /tmp/execWorks
Esecuzione di comandi interattivi con Docker Exec
Fino a questo punto, hai imparato come eseguire comandi non interattivi in un contenitore Docker con docker exec
. Tuttavia, potresti dover affrontare un momento in cui devi risolvere i problemi di un contenitore, ad esempio, quando devi inviare comandi al contenitore in modo interattivo. In tal caso, devi eseguire i comandi in modo interattivo.
Esecuzione di comandi in modo interattivo con docker exec
richiede due opzioni, i
e t
. Il i
l'opzione mantiene aperto STDIN, consentendo l'invio di comandi al contenitore e il t
l'opzione assegna uno pseudo-TTY (PTY), un canale di comunicazione, per digitare i comandi.
Copia e incolla il comando seguente per aprire un prompt dei comandi interattivo nel contenitore Docker in esecuzione con la shell Bourne (sh), come indicato dalla modifica del prompt in / #
.
docker exec -it mystifying_chandrasekhar sh
Una volta nella shell, ora esegui i comandi seguenti per dimostrare l'elenco dei file dall'interno del contenitore. Infine, eseguendo exit
comando per uscire dalla shell interattiva.
ls -l /var/log
exit
Per aprire un prompt interattivo in una directory specifica, passare il percorso a
w
opzione che dice a Docker di avviare la shell in una directory specificata.
Trasferimento di variabili ambientali a un container funzionante
Molti programmi utilizzano variabili di ambiente per impostare le configurazioni all'avvio. Ad esempio, la maggior parte delle applicazioni Java richiedono il JAVA_HOME
variabile ambientale da impostare sul percorso Java.
Puoi passare variabili d'ambiente a una sessione usando e
opzione. Ad esempio, forse è necessario popolare una variabile di ambiente chiamata MYVAR
in un contenitore funzionante. Per farlo, usa la e
opzione e fornisci la coppia chiave/valore di MYVAR="<some value>"
come mostrato di seguito.
docker exec -it -e MYVAR="hello" mystifying_chandrasekhar sh
echo $MYVAR
Trasferimento di variabili d'ambiente con un file
Se si dispone di molte variabili ambientali o di una configurazione condivisa, la memorizzazione di tali variabili in un file potrebbe essere più semplice. Passa il file tramite un percorso relativo o assoluto a Docker con il --env-file
opzione. Questa tecnica viene spesso utilizzata per fornire credenziali sicure a un container. Assicurati di non eseguire mai il commit delle credenziali per il controllo della versione!
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 del .txt
estensione del file.
Passa le variabili ambientali a Docker con il env-file
opzione. Verifica che le variabili siano disponibili con echo
comando come mostrato nello screenshot qui sotto.
# Pass the env-vars.txt file and open an interactive prompt
docker exec -it --env-file env-vars.txt mystifying_chandrasekhar sh
# Verify that the environmental variables are available in the Docker container
echo $MYVAR
echo $FOO
echo $SOMETHING
Interazione con un container in esecuzione come utente diverso
In produzione, le applicazioni spesso vengono eseguite come un utente specifico per limitarne l'accesso. Se esegui applicazioni come utente specifico in produzione, dovresti farlo anche durante il test dei comandi.
In questo esempio, il contenitore Docker viene eseguito come nginx
utente. Passa l'utente al w
opzione per dire a Docker di avviare il contenitore come nginx
account. Il whoami
comando, eseguito dall'interno del contenitore, conferma che il nginx
utente è effettivamente utilizzato.
docker exec -it -u nginx mystifying_chandrasekhar sh
whoami
Passaggi successivi
Hai imparato come eseguire comandi all'interno di un contenitore in esecuzione utilizzando docker exec
comando. Utilizzando il exec
comando per entrare e interrogare i container in esecuzione, hai un nuovo potente strumento nel tuo arsenale per risolvere i problemi dei container Docker.
Ora prova a fare un ulteriore passo avanti e usa il controllo della versione Git per inserire un sito Web statico nel contenitore, anziché copiare un singolo file. Se Git è nuovo per te, l'articolo Guida per principianti a Visual Studio Code e Git è un ottimo punto di partenza.