saverioriotto.it

Lavorare su più host con l'utilizzo dei contesti Docker

I contesti nella CLI Docker forniscono un meccanismo semplificato per interagire con più endpoint Docker. Puoi impostare contesti per ciascuno dei tuoi host e passare da uno all'altro al volo.

Lavorare su più host con l'utilizzo dei contesti Docker

Quando un contesto è attivo, Docker indirizzerà tutti i comandi a quell'host. Se utilizzi principalmente un'installazione Docker locale ma a volte devi avviare i container in produzione, i contesti Docker sono un'opzione a tua disposizione.

Qualsiasi endpoint Docker valido può essere trasformato in un contesto. Puoi collegare le normali installazioni di Docker Engine, i cluster Docker Swarm e i cluster Kubernetes nel cloud. Ciascun contesto archiviato contiene tutte le informazioni di connessione per l'host di riferimento.

Creazione di un contesto

I contesti sono gestiti con il comando docker context. Per creare nuovi contesti va usato il comando docker context create. È necessario fornire un nome per il contesto e la configurazione dell'endpoint.

Ecco come creare un contesto che si connette a un socket Docker esposto su un host remoto:

docker context create remote-host --docker host=tcp:///my-remote-host:2735

I contesti usano Docker Swarm come orchestratore di contenitori predefinito. Puoi impostarlo esplicitamente usando un flag:

docker context create remote-host \
--default-stack-orchestrator=swarm \
--docker host=tcp:///my-remote-host:2735

Per creare una connessione a Kubernetes, cambia il tipo dell'agente di orchestrazione. Devi anche aggiungere il flag --kubernetes e specificare il percorso di un file di configurazione Kubernetes:

docker context create kubernetes-host \
--default-stack-orchestrator=kubernetes \
--kubernetes config-file=/home/username/.kube/config \
--docker host=unix:///var/run/docker.sock

Selezione dei contesti

Il contesto attivo viene cambiato utilizzando docker context use passando il nome del contesto da attivare.

docker context use remote-host

Tutti i successivi comandi CLI verranno eseguiti utilizzando l'endpoint fornito dal nuovo contesto. Il contesto attivo persisterà automaticamente finché non lo modificherai. Per passare a un contesto diverso, esegui di nuovo docker context use. Per ripristinare il contesto predefinito del tuo socket Docker locale va utilizzato default come nome del contesto.

Puoi sempre sovrascrivere il contesto selezionato aggiungendo il flag --context a qualsiasi comando Docker:

docker run ubuntu:latest --context remote-host

La variabile d'ambiente DOCKER_CONTEXT funziona anche come alternativa al flag --context. Entrambi i meccanismi facilitano il passaggio temporaneo a un contesto diverso senza dover eseguire e ripristinare il comando docker context use.

L'uso della variabile d'ambiente DOCKER_HOST sovrascriverà anche il contesto attivo. Questa variabile obbliga Docker a utilizzare un particolare endpoint del demone invece di quello fornito dal contesto.

È possibile esaminare il contesto attivo eseguendo docker context ls. Questo comando elenca tutti i contesti disponibili nella configurazione della CLI. Il contesto attivo è evidenziato con un asterisco. Per eliminare un contesto, eseguire docker context rm, fornendo il nome del contesto. Non è possibile eliminare il contesto default.

Sincronizzazione di contesti tra macchine

I file di contesto sono archiviati nella directory di configurazione della Docker CLI. Questo di solito su Linux è $HOME/.docker. Troverai i tuoi contesti nella sottodirectory contexts. Ogni contesto ottiene la propria cartella denominata con un hash univoco. All'interno troverai un file meta.json che descrive il contesto. Solo i contesti creati hanno file archiviati su disco. Il contesto default eredita le impostazioni dalla configurazione del demone Docker.

Se si desidera sincronizzare la configurazione del contesto, è possibile eseguire il backup dellacartella contexts per spostarla su un'altra macchina. Puoi utilizzare un trasferimento Rsync o un repository Git per semplificare gli aggiornamenti regolari. Anche il collegamento simbolico della cartella a una condivisione di rete potrebbe essere un'opzione a seconda dei requisiti.

Docker ti consente anche di esportare e importare contesti tramite la CLI:

docker context export my-context

Questo creerà un file my-context.dockercontext nella tua directory di lavoro. Il file include contenuto meta.json e alcune informazioni aggiuntive, come il nome del contesto. Trasferisci questo file su un'altra macchina ed esegui docker context import my-context.dockercontext per caricare la configurazione del contesto.

In alternativa, puoi esportare un file di configurazione Kubernetes autonomo per i contesti Kubernetes:

docker context export kubernetes-context --kubeconfig

Ciò produrrà un normale file "kubeconfig" compatibile con gli strumenti dell'ecosistema Kubernetes come kubectl. La possibilità di acquisire un file kubeconfig da un contesto Docker migliora l'interoperabilità. Niente all'interno del file sarà specifico per Docker CLI.

Se hai bisogno di modificare un contesto, usa il comando docker context update. Questo accetta gli stessi flag di docker context create. Se stai effettuando aggiornamenti in blocco, puoi modificare i file meta.json per manipolare direttamente i tuoi contesti. Puoi ispezionare un file meta.json di contesto dalla CLI con docker context inspect my-context.

Conclusione

I contesti Docker sono utili quando è necessario distribuire contenitori in più ambienti indipendenti. Puoi configurare i contesti per il tuo socket Docker locale, un server di gestione temporanea del team condiviso e il tuo server Kubernetes di produzione.

Docker ha il supporto integrato per i cloud container Microsoft Azure e Amazon ECS, che possono essere aggiunti anche come contesti. Non c'è limite al numero di contesti che puoi creare, quindi hai una buona versatilità mentre ti muovi tra i tuoi host.

Probabilmente il più grande problema funzionale con i contesti è la possibilità di eseguire accidentalmente un comando nel contesto sbagliato. Se hai dimenticato di essere nel tuo contesto production, il comando docker rm database-container potrebbe avere conseguenze devastanti. In caso di dubbio, usa sempre il comando docker context ls prima di effettuare qualsiasi operazione.




Commenti
* Obbligatorio