Di solito si desidera che le applicazioni Docker siano completamente contenute, ma a volte per scopi di sviluppo o automazione è utile poter lavorare con i container Docker come se ci fossero macchine virtuali Linux. Docker fornisce strumenti per eseguire comandi e persino intere shell all'interno di contenitori.
Esecuzione dei comandi nei contenitori
Per eseguire un comando in un contenitore, avrai bisogno del suo ID contenitore, a meno che tu non abbia impostato un nome specifico per quel contenitore. Questa è una lunga stringa esadecimale che puoi trovare dall'elenco dei processi Docker:
docker ps
Quindi, puoi usare exec -it
comando da eseguire all'interno del contenitore. Ad esempio, visualizzando l'output di un file di registro:
docker exec -it containerID tail /var/log/nginx/access.log
Puoi anche eseguire script all'interno di contenitori:
docker exec -it containerID script.sh
Il -it
i flag sono rispettivamente per "modalità interattiva" e TTY e sono usati quasi sempre. Ci sono alcuni altri flag che puoi usare:
--workdir
o-w
cambia la directory corrente prima del comando.--detach
o-d
, esegue il comando in background.--env
o-e
, imposta le variabili di ambiente prima dell'esecuzione.--env-file
fa lo stesso, ma è più sicuro per la gestione dei segreti.--privileged
esegue il comando con autorizzazioni estese.--user
viene eseguito come un utente diverso
Naturalmente, questo funziona solo su un contenitore in esecuzione. Se desideri sospendere un container per eseguire la manutenzione, dovrai distribuire gli aggiornamenti tramite una nuova versione dell'immagine o apportare modifiche ai dati montati sul volume dal sistema operativo host.
SSHing in un container
Non sei limitato a semplici comandi, puoi effettivamente aprire una shell eseguendo /bin/bash
come il comando. Potresti essere limitato negli strumenti disponibili:la maggior parte dei container presenta un'installazione Linux abbastanza semplice, ma rende molto più semplice l'esecuzione di molti comandi.
docker exec -it containerID /bin/bash
Questa è semplicemente una shell accessibile dall'host, che funziona bene nella maggior parte dei casi. Ma, se lo desideri, puoi configurare i tuoi container in modo che siano completamente disponibili su SSH come un VPS. Puoi leggere ulteriori informazioni sulla configurazione nella nostra guida all'esecuzione di un servizio SSH in un container Docker.
RELAZIONATO: Come eseguire SSH in un contenitore Docker
Copiare file in e da contenitori
Esecuzione di comandi con exec -it
funziona, ma c'è ancora uno strato tra l'host e il contenitore che impedisce un facile script. Per uno, mentre è facile inviare comandi a un container, è più difficile ottenere output dal filesystem.
Mentre puoi pipe lo STDOUT di exec -it
ad altri servizi sul sistema operativo host, puoi anche copiare file da e verso il filesystem del contenitore. Ad esempio, estraendo un file di registro e incollandolo sull'host:
docker cp container:/var/log/nginx/example.log example.log
O estraendo intere directory:
docker cp nginx:/etc/nginx/ nginxconfig/
Tuttavia, se lo fai regolarmente, potresti prendere in considerazione l'utilizzo di un binding o di un montaggio del volume per rendere i dati direttamente accessibili dall'host.
RELAZIONATO: Come utilizzare Docker Cp per copiare file tra host e container