Docker di solito fornisce la prima introduzione di uno sviluppatore ai container. Kubernetes è una piattaforma di orchestrazione che risolve le sfide relative all'esecuzione di container in produzione. Ecco come i comandi Docker vengono mappati alle loro controparti Kubernetes.
Non puoi utilizzare la docker
CLI per interagire con i container in esecuzione in Kubernetes. Kubernetes fornisce la propria interfaccia a riga di comando, kubectl
, per aiutarti a gestire il tuo cluster. Leggi la nostra guida per iniziare con kubectl
se non hai familiarità con lo strumento.
Nessuno dei docker
i comandi hanno lo stesso nome in kubectl
. Kubernetes espone la funzionalità a modo suo. I carichi di lavoro stessi sono fondamentalmente diversi:Docker è progettato per funzionare con un singolo container alla volta, mentre Kubernetes consente l'orchestrazione di più repliche.
Il primo punto da apprezzare è il cambio di terminologia. Docker si riferisce a "contenitori" mentre Kubernetes usa "baccelli". Un pod potrebbe eseguire un contenitore o più repliche gestite come una singola unità. A parte questo dettaglio, quando vedi "contenitore" in Docker, dovresti pensare a un "baccello" Kubernetes. I termini verranno utilizzati in modo intercambiabile per il resto di questo articolo.
Ottenere i dettagli dei tuoi container
In Docker, usi docker ps -a
per vedere tutti i contenitori sulla tua macchina.
L'equivalente Kubernetes più vicino è kubectl get pods
.
L'output dei due comandi è abbastanza diverso. Docker mostra ulteriori informazioni sul carico di lavoro in esecuzione nel container.
Kubernetes fornirà dettagli sull'immagine e sul comando quando si utilizza il describe pod
comando. Devi passare il nome del pod. Questo fornisce informazioni molto più dettagliate, utilizzando un elenco anziché una tabella.
Esecuzione dei comandi nei contenitori
Docker ti consente di eseguire un comando in un contenitore in esecuzione utilizzando docker exec
.
L'equivalente di Kubernetes è anche chiamato exec
. Usa il nome del pod Kubernetes invece del nome del contenitore Docker. Il comando è specificato in modo leggermente diverso:deve essere separato dal nome del pod da un --
sequenza.
Puoi usare il -it
flag per ottenere l'accesso interattivo allo stesso modo di Docker. Questa è una scorciatoia per --stdin --tty
e dovrebbe essere usato ogni volta che vuoi lanciare una shell all'interno di un pod. Specifica il nome della shell, ad esempio bash
, come comando.
Kubectl supporta il attach
comando per quando vuoi collegarti a un processo in un contenitore che è già in esecuzione. Funziona in modo simile a docker attach
ma dovresti passare il -it
flag se hai bisogno di un accesso interattivo.
Visualizzazione dei log dei contenitori
Per visualizzare i log di un container con Docker, utilizza i docker logs
comando. Aggiunta di -f
switch "seguirà" i log in modo che vengano trasmessi continuamente al tuo terminale.
logs
di Kubectl comando ha la stessa sintassi. Fornisci un nome pod nello stesso modo in cui Docker accetta un nome contenitore.
Sia Docker che Kubernetes raccolgono i log dall'output standard e dall'errore standard (stdout
/stderr
) flussi di contenitori in esecuzione. Kubernetes gestisce i riavvii dei container in modo diverso rispetto a Docker. Mentre in Docker un container riavviato aggiunge i propri log a quelli esistenti, Kubernetes crea un nuovo log per ogni esecuzione. Puoi ottenere i log di un container sostituito aggiungendo il --previous
segnala ai logs
comando.
Creazione di contenitori
I container Docker vengono creati con run
comando. Ecco come puoi avviare un nginx
server con Docker:
docker run -d --name nginx --restart=always -p 80:80 nginx
Questo crea un contenitore usando nginx
immagine di base e imposta il riavvio automatico. Il server è associato alla porta HTTP predefinita 80.
Kubernetes richiede di pensare ad astrazioni di livello superiore quando aggiungi contenitori al tuo cluster. Invece di eseguire un container, stai creando una implementazione per rappresentare il tuo carico di lavoro:
kubectl create deployment --image=nginx nginx
Questo creerà un nginx
distribuzione. Un pod viene avviato automaticamente; all'interno del pod, ci sarà un container che esegue il server web.
La creazione di una distribuzione non legherà i suoi contenitori a nessuna porta. Il server appena creato non è ancora accessibile. Le porte devono essere esposte tramite un servizio . I pod sono effimeri e possono contenere più contenitori replicati. I servizi definiscono una raccolta logica di pod e ti consentono di assegnare loro risorse di rete come un indirizzo IP e una porta.
Esporre nginx
la distribuzione sulla porta 80 consentirà l'accesso al server:
kubectl expose deployment nginx --port=80 --name nginx-http
Il tentativo di accedere alla porta 80 sull'indirizzo IP predefinito del cluster dovrebbe ora indirizzarti a nginx
server.
Kubectl non supporta direttamente altre docker run
opzioni come la creazione del volume e il montaggio del binding. I contenitori che richiedono l'archiviazione persistente dovranno avere i volumi configurati manualmente tramite kubectl
comandi o un manifest di volume.
Rimozione dei contenitori
I contenitori Docker vengono rimossi utilizzando docker rm
comando con l'ID del contenitore.
Kubernetes non ti consente di eliminare direttamente i contenitori. Invece, lavori con la implementazione che ha creato il baccello. Usa il kubectl delete deployment
comando, passando il nome della distribuzione.
Docker ti consente di fermare un contenitore invece di rimuoverlo. Kubernetes ha rimosso il supporto per questa azione. Il modo consigliato per sospendere temporaneamente una distribuzione consiste nel ridimensionare il conteggio delle repliche fino a 0. Senza pod in esecuzione, il carico di lavoro viene effettivamente interrotto.
kubectl scale --replicas=0 deployment/my-deployment
Quando sei pronto per riprendere la distribuzione, esegui scale
comando di nuovo. Imposta il nuovo conteggio delle repliche su 1
o più alto. L'utilizzo di più repliche può aumentare la disponibilità del tuo carico di lavoro.
Conclusione
Non ci sono paralleli diretti tra Docker CLI e kubectl
. La maggior parte dei comandi Kubernetes ha una sintassi diversa rispetto alle loro controparti Docker. Dovrai imparare nuovi termini e opzioni prima di poter trasferire i flussi di lavoro basati su Docker su Kubernetes.
In molti casi, non esiste kubectl
alternativa a una funzionalità Docker CLI. La funzionalità di Docker è focalizzata sul concetto di contenitore. Kubernetes lo prende e lo pone al centro di un ecosistema di risorse notevolmente ampliato.
Raramente i contenitori vengono trattati in isolamento. Dovrai invece lavorare con risorse come distribuzioni, servizi e set di repliche. Questo è il motivo per cui l'apprendimento di Kubernetes può sembrare difficile quando ci si avvicina al punto di vista di un utente Docker.
Se hai familiarità con i fondamenti di Docker, il passaggio a Kubernetes dovrebbe comunque essere relativamente semplice. La differenza principale è che ciò che Docker vede come un container è generalmente accessibile come un "pod" aggregato in Kubernetes. I pod vengono creati da "distribuzioni" che rappresentano i carichi di lavoro nel tuo cluster. In caso di dubbio, fare riferimento a kubectl
docs per trovare una corrispondenza appropriata per un comando Docker.