GNU/Linux >> Linux Esercitazione >  >> Panels >> Docker

Cos'è Docker? Come funziona?

In questa guida completa, ho spiegato cos'è Docker, la sua evoluzione, i concetti fondamentali di Linux alla base e come funziona.

Docker è diventato lo standard di fatto quando si tratta di implementazioni basate su container. Docker è la base per l'orchestrazione basata su container da implementazioni su piccola scala ad applicazioni aziendali su larga scala.

Docker ha guadagnato così tanta popolarità e adozione nella comunità DevOps rapidamente perché è stato sviluppato per la portabilità e progettato per la moderna architettura di microservizi.

In questo blog imparerai,

  1. Cos'è Docker?
  2. Scopri Docker e scopri perché Docker è vantaggioso e diverso dalle altre tecnologie di container.
  3. Architettura di base Docker e suoi componenti chiave
  4. Evoluzione dei container e concetto alla base dei container Linux
  5. Cos'è un container e quali funzionalità di Linux lo fanno funzionare?
  6. La differenza tra un processo, un container e una VM

In questo caso, l'idea è di avere le basi giuste per capire cos'è veramente Docker e come funziona.

Cos'è Docker?

Docker è un popolare progetto open source scritto in go e sviluppato da Dotcloud (una società PaaS).

È un motore contenitore che utilizza le funzionalità del kernel Linux come spazi dei nomi e gruppi di controllo per creare contenitori su un sistema operativo. Quindi puoi chiamarla virtualizzazione a livello di sistema operativo.

Docker è stato inizialmente creato su contenitori Linux (LXC) . Successivamente Docker ha sostituito LXC con il suo container runtime libcontainer (ora parte di runc). Ho spiegato i concetti fondamentali di LXC e container verso la fine dell'articolo.

Potresti chiederti in che modo Docker è diverso da un Linux Container (LXC) poiché tutti i concetti e l'implementazione sembrano simili?

Oltre ad essere solo una tecnologia per container, Docker ha componenti wrapper ben definiti che rendono facili le applicazioni di confezionamento . Prima di Docker, non era facile eseguire i container. Ciò significa che fa tutto il lavoro per disaccoppiare la tua applicazione dall'infrastruttura impacchettando tutti i requisiti di sistema dell'applicazione in un contenitore.

Ad esempio, se hai un file jar Java, puoi eseguirlo su qualsiasi server su cui è installato java. Allo stesso modo, una volta creato il pacchetto di un container con le applicazioni richieste utilizzando Docker, puoi eseguirlo su qualsiasi altro host su cui sia installato Docker.

Avremo contenitori attivi e funzionanti eseguendo alcuni comandi e parametri Docker.

Differenza tra Docker e Container

Docker è una tecnologia o uno strumento sviluppato per gestire i container in modo efficiente.

Quindi, posso eseguire un container senza Docker?

Sì! Certo. Puoi utilizzare la tecnologia LXC per eseguire container su server Linux. Inoltre, gli strumenti più recenti come Podman offrono flussi di lavoro simili come Docker.

Cose che dovresti sapere su Docker:

  1. Docker non è LXC
  2. Docker non è una soluzione per macchine virtuali.
  3. Docker non è un sistema di gestione della configurazione e non sostituisce Chef, Puppet, Ansible, ecc.
  4. Docker non è una piattaforma come tecnologia di servizio.
  5. Docker non è un contenitore.

Cosa rende Docker così eccezionale?

Docker dispone di un flusso di lavoro efficiente per spostare l'applicazione dal laptop dello sviluppatore all'ambiente di test alla produzione. Ne capirai di più quando guarderai un esempio pratico di impacchettamento di un'applicazione in un'immagine Docker.

Sai che l'avvio di un contenitore mobile richiede meno di un secondo ?

È incredibilmente veloce e può essere eseguito su qualsiasi host con kernel Linux compatibile. (Supporta anche Windows)

Nota: non è possibile eseguire un contenitore Windows su un host Linux perché non è disponibile il supporto del kernel Linux per Windows. Puoi leggere i contenitori di Windows da qui

Docker utilizza un file system union Copy-on-write per l'archiviazione delle immagini. Pertanto, quando vengono apportate modifiche a un contenitore, solo le modifiche verranno scritte su disco utilizzando la copia sul modello di scrittura.

Con Copia in scrittura, avrai livelli di archiviazione condivisi ottimizzati per tutti i tuoi contenitori.

Statistiche sull'adozione di Docker

Ecco i dati sulle tendenze di Google su Docker. Puoi vedere che è stato un argomento esplosivo negli ultimi cinque anni.

Ecco un risultato del sondaggio di Datadog, che mostra l'aumento dell'adozione di Docker.

Architettura Docker Core

Le sezioni seguenti esamineranno l'architettura Docker e i suoi componenti associati. Vedremo anche come ogni componente interagisce insieme per far funzionare Docker.

L'architettura Docker è cambiata alcune volte dal suo inizio. Quando ho pubblicato la prima versione di questo articolo, Docker era basato su LXC

Ecco alcune importanti modifiche all'architettura avvenute per Docker

  1. Docker è passato da LXC a libcontainer nel 2014
  2. runc:una CLI per la rotazione di container che seguono tutte le specifiche OCI.
  3. containerd:Docker ha separato il suo componente di gestione dei container in containerd nel 2016

OCI:Open Container Initiative è uno standard industriale aperto per il runtime e le specifiche dei container.

Quando Docker è stato inizialmente lanciato, aveva un'architettura monolitica. Ora è separato nei seguenti tre diversi componenti.

  1. Motore Docker (docker)
  2. docker-containerd (contenitore)
  3. docker-runc (runc)

Docker e altre grandi organizzazioni hanno contribuito a un runtime di container standard e livelli di gestione. Quindi containerd e runc fanno ora parte della Cloud Native Foundation con i contributori di tutte le organizzazioni.

Nota: Durante l'installazione di Docker, tutti questi componenti vengono installati. Non è necessario installarlo separatamente. Per esplicazione, lo mostriamo come componenti diversi.

Ora diamo un'occhiata a ciascun componente Docker.

Motore Docker

Il motore Docker comprende il demone Docker, un'interfaccia API e Docker CLI. Il demone Docker (dockerd) viene eseguito continuamente come dockerd servizio di sistema. È responsabile della creazione delle immagini della finestra mobile.

Per gestire le immagini ed eseguire i contenitori, dockerd chiama il docker-containerd API.

docker-containerd (containerd)

containerd è un altro servizio del demone di sistema responsabile del download delle immagini della finestra mobile e dell'esecuzione come contenitore. Espone la sua API per ricevere istruzioni dalla dockerd servizio

docker-runc

runc è il runtime del contenitore responsabile della creazione degli spazi dei nomi e dei cgroup richiesti per un contenitore. Quindi esegue i comandi del contenitore all'interno di quegli spazi dei nomi. runtime è implementato secondo la specifica OCI.

Leggi questa eccellente serie di post di blog in 3 parti per saperne di più sui runtime dei container.

Come funziona Docker?

Abbiamo visto i mattoni fondamentali di Docker.

Ora comprendiamo il flusso di lavoro Docker utilizzando i componenti Docker.

Componenti Docker

La seguente architettura Docker di alto livello ufficiale diagramma mostra il flusso di lavoro Docker comune.

L'ecosistema Docker è composto dai seguenti quattro componenti

  1. Daemon Docker (dockerd)
  2. Cliente Docker
  3. Immagini Docker
  4. Registri Docker
  5. Contenitori Docker

Cos'è un Docker Daemon?

Docker ha un'architettura client-server. Demone Docker (dockerd ) o il server è responsabile di tutte le azioni relative ai contenitori.

Il demone riceve i comandi dal client Docker tramite CLI o API REST. Il client Docker può trovarsi sullo stesso host di un demone o essere presente su qualsiasi altro host.

Per impostazione predefinita, il demone docker ascolta docker.sock presa UNIX. Se hai un caso d'uso per accedere all'API Docker in remoto, devi esporlo su una porta host. Uno di questi casi d'uso è l'esecuzione di Docker come agenti Jenkins.

Se desideri eseguire Docker all'interno di Docker, puoi utilizzare docker.sock dalla macchina host.

Cos'è un'immagine Docker?

Le immagini sono gli elementi costitutivi di base di Docker. Contiene le librerie del sistema operativo, le dipendenze e gli strumenti per eseguire un'applicazione.

Le immagini possono essere precostruite con le dipendenze dell'applicazione per la creazione di contenitori. Ad esempio, se desideri eseguire un server Web Nginx come contenitore Ubuntu, devi creare un'immagine Docker con il binario Nginx e tutte le librerie del sistema operativo necessarie per eseguire Nginx.

Cos'è un Dockerfile?

Docker ha un concetto di Dockerfile che viene utilizzato per costruire l'immagine. Un Dockerfile un file di testo che contiene un comando (istruzioni) per riga.

Ecco un esempio di Dockerfile.

Un'immagine della finestra mobile è organizzata in modo stratificato. Ogni istruzione su un Dockerfile viene aggiunto un livello in un'immagine. Il livello scrivibile più in alto dell'immagine è un contenitore.

Ogni immagine viene creata da un'immagine di base.

Ad esempio, se puoi utilizzare un'immagine di base di Ubuntu e creare un'altra immagine con l'applicazione Nginx. Un'immagine di base può essere un'immagine principale o un'immagine creata da un'immagine principale. Dai un'occhiata al suo articolo sulla finestra mobile per saperne di più.

Potresti chiedere da dove viene questa immagine di base (immagine principale)? Sono disponibili utilità Docker per creare l'immagine di base padre iniziale. Prende le librerie del sistema operativo richieste e le inserisce in un'immagine di base. Non devi farlo perché otterrai le immagini di base ufficiali per le distribuzioni Linux.

Il livello superiore di un'immagine è scrivibile e utilizzato dal contenitore in esecuzione. Gli altri livelli nell'immagine sono di sola lettura.

Cos'è un registro Docker?

È un repository (archiviazione) per le immagini Docker.

Un registro può essere pubblico o privato. Ad esempio, Docker Inc fornisce un servizio di registro ospitato chiamato Docker Hub. Ti consente di caricare e scaricare immagini da una posizione centrale.

Nota: Per impostazione predefinita, quando installi Docker, cerca le immagini dall'hub Docker pubblico, a meno che tu non specifichi un registro personalizzato nelle impostazioni Docker.

Altri utenti dell'hub Docker possono accedere a tutte le tue immagini se il tuo repository è pubblico. Puoi anche creare un registro privato in Docker Hub.

L'hub Docker si comporta come git, in cui puoi creare le tue immagini localmente sul tuo laptop, eseguirne il commit e quindi inviarle all'hub Docker.

Suggerimento: Quando si utilizza la finestra mobile in reti/progetti aziendali, configurare i propri registri Docker invece di utilizzare l'hub Docker pubblico. Tutti i fornitori di servizi cloud dispongono dei propri servizi di registro dei contenitori.

Cos'è un Docker Container?

I contenitori Docker vengono creati da immagini esistenti. È un livello scrivibile dell'immagine.

Se provi a mettere in relazione livelli immagine e un contenitore, ecco come cerca un'immagine basata su Ubuntu.

Puoi impacchettare le tue applicazioni in un contenitore, eseguirne il commit e trasformarlo in un'immagine d'oro per creare più contenitori da esso.

I container possono essere avviati, arrestati, sottoposti a commit e terminati. Se termini un contenitore senza eseguirne il commit, tutte le modifiche al contenitore andranno perse.

Idealmente, i contenitori vengono trattati come oggetti immutabili e non è consigliabile apportare modifiche a un contenitore in esecuzione. Invece, apporta modifiche a un contenitore in esecuzione solo a scopo di test.

Due o più contenitori possono essere collegati insieme per formare un'architettura dell'applicazione a livelli. Tuttavia, l'hosting di applicazioni altamente scalabili con Docker è stato semplificato con l'avvento di strumenti di orchestrazione dei container come kubernetes.

Evoluzione dei contenitori

Se pensi che la containerizzazione sia una nuova tecnologia, non lo è. Google utilizza da anni la tecnologia dei container nella sua infrastruttura.

Il concetto di container è iniziato negli anni 2000. In effetti, le radici risalgono al 1979 quando avevamo chroot, un concetto per cambiare la directory principale di un processo.

Ecco un elenco di progetti basati su container iniziati nel 2000.

Anno Tecnologia
2000 Le jail di FreeBSD hanno introdotto il concetto di container.
2003 Progetto server Linux-V rilasciato con il concetto di virtualizzazione a livello di sistema operativo
2005 Solaris Zones:introdotto il progetto di virtualizzazione a livello di sistema operativo
2007 Google ha pubblicato un documento sui contenitori di processo generici
2008 Il rilascio iniziale dei container LXC
2011 cloudfoundry ha annunciato il direttore
2013 lcmcty:open source di Google
2013 Il progetto Docker è stato annunciato da DotCloud
2014 Razzo. (rkt) annunciato da CoreOS
2016 Anteprima del contenitore di Windows rilasciata come parte di Windows Server 2016

Cos'è un container Linux (LXC)?

Ora capiamo cos'è un contenitore Linux.

In un tipico ambiente virtualizzato, una o più macchine virtuali vengono eseguite su un server fisico utilizzando un hypervisor come Xen, Hyper-V, ecc.

D'altra parte, i contenitori vengono eseguiti sopra il kernel del sistema operativo. Puoi chiamarla virtualizzazione a livello di sistema operativo. Prima di entrare nei concetti sottostanti del contenitore, devi comprendere due concetti chiave di Linux.

  1. Spazio utente: Tutto il codice necessario per eseguire i programmi utente (applicazioni, processi) è chiamato spazio utente. Quando avvii un'azione del programma, ad esempio per creare un file, il processo nello spazio utente effettua una chiamata di sistema allo spazio del kernel.
  2. Spazio del kernel :Questo è il cuore del sistema operativo, dove hai il codice del kernel, che interagisce con l'hardware del sistema, lo storage, ecc.

Un contenitore è un processo.

Si avvia un processo quando si avvia un'applicazione, ad esempio un server Web Nginx. Un processo stesso è un'istruzione autonoma con isolamento limitato.

E se riuscissimo a isolare il processo con solo i file e la configurazione necessari per l'esecuzione e il funzionamento. Questo è ciò che fa un container.

Un contenitore è un processo con un isolamento sufficiente dei componenti dello spazio utente per dare la sensazione di un sistema operativo separato.

Il processo contenitore padre può avere un processo figlio. Quindi puoi dire che un contenitore è anche un gruppo di processi .

Ad esempio, quando avvii un servizio Nginx, viene avviato un processo Nginx padre. Il processo padre comprende i suoi processi figlio come gestore della cache, caricatore della cache e worker.

Quindi, quando avvii un container Nginx, stai avviando un processo Nginx master nel suo ambiente isolato.

Te lo mostrerò praticamente nelle sezioni seguenti.

Ogni contenitore ha il suo spazio utente isolato e puoi eseguire più contenitori su un singolo host.

Significa che un contenitore ha l'intero sistema operativo ?

No. A differenza di una macchina virtuale con il suo kernel, un container contiene i file richiesti relativi a una distribuzione specifica e utilizza il kernel dell'host condiviso.

Ancora più interessante, puoi eseguire diversi contenitori basati su distribuzioni Linux su un singolo host che condivide lo stesso spazio del kernel.

Ad esempio, puoi eseguire un RHEL, CentOS, un contenitore basato su SUSE su un server Ubuntu. È possibile perché solo lo spazio utente è diverso per tutte le distribuzioni Linux e lo spazio del kernel è lo stesso.

Concetto di base dei container Linux

L'immagine seguente offre una rappresentazione visiva dei container Linux.

I container vengono isolati utilizzando le due funzionalità del kernel Linux chiamate namespace e gruppi di controllo.

Un'analogia con il mondo reale sarebbe un condominio. Anche se è un unico grande edificio, ogni condominio/appartamento è isolato per le singole famiglie che hanno la propria identità con acqua, gas ed elettricità misurati. Usiamo cemento, strutture in acciaio e altri materiali da costruzione per stabilire questo isolamento. Non hai visibilità in altre case a meno che non ti permettano di entrare.

Allo stesso modo, puoi correlare questo a un singolo host contenente più contenitori. Per isolare i container con la loro CPU, memoria, indirizzo IP, punti di montaggio, processi, sono necessarie due caratteristiche del kernel Linux chiamati spazi dei nomi e gruppi di controllo.

Spazi dei nomi Linux

Un contenitore consiste nell'avere un ambiente ben isolato per eseguire un servizio (Processo). Per raggiungere quel livello di isolamento, un container dovrebbe avere il suo file system, indirizzo IP, punti di montaggio, ID di processo, ecc. Puoi ottenerlo usando gli spazi dei nomi di Linux.

Gli spazi dei nomi sono responsabili dei punti di montaggio, dell'utente, dell'indirizzo IP, della gestione dei processi e così via dei container. Quindi, in sostanza, imposta i limiti per i container.

Di seguito sono riportati gli spazi dei nomi chiave in Linux

  1. spazio dei nomi pid :Responsabile dell'isolamento del processo (PID:Process ID).
  2. spazio dei nomi netto :Gestisce le interfacce di rete (NET:Networking).
  3. spazio dei nomi ipc :Gestisce l'accesso alle risorse IPC (IPC:InterProcess Communication).
  4. mnt namespace :Responsabile della gestione dei punti di montaggio del filesystem (MNT:Mount).
  5. uts namespace :isola gli identificatori del kernel e della versione. (UTS:sistema di multiproprietà Unix).
  6. spazio dei nomi usr: Isola gli ID utente. In parole semplici, isola gli ID utente tra host e container.
  7. Spazio dei nomi Cgroup: Isola le informazioni del gruppo di controllo dal processo contenitore

Utilizzando gli spazi dei nomi sopra, un container può avere le sue interfacce di rete, l'indirizzo IP, ecc. Ogni container avrà il suo spazio dei nomi e i processi in esecuzione all'interno di tale spazio dei nomi non avranno alcun privilegio al di fuori del suo spazio dei nomi.

È interessante notare che puoi elencare gli spazi dei nomi in una macchina Linux usando lsns comando.

Gruppi di controllo Linux

Non specifichiamo alcun limite di memoria o CPU all'avvio di un servizio. Invece, lasciamo al kernel il compito di stabilire la priorità e allocare le risorse per i servizi.

Tuttavia, puoi impostare in modo esplicito i limiti di memoria della CPU per i tuoi servizi utilizzando una funzionalità del kernel Linux chiamata CGroups . Non è un approccio diretto; devi apportare alcune configurazioni e modifiche extra per farlo funzionare.

Poiché puoi eseguire più contenitori all'interno di un host, dovrebbe esserci un meccanismo per limitare l'utilizzo delle risorse, l'accesso ai dispositivi, ecc. È qui che entrano in gioco i gruppi di controllo.

I gruppi di controllo Linux gestiscono le risorse utilizzate da un container. Puoi limitare le risorse di CPU, memoria, rete e IO di un gruppo di controllo Linux container.

Quindi cosa succede se non limito la CPU e le risorse di memoria di un container?

Un singolo container potrebbe utilizzare tutte le risorse dell'host, lasciando gli altri container in crash a causa dell'indisponibilità delle risorse.

Strumenti come Docker astraggono tutte le complesse configurazioni di back-end e ti consentono di specificare questi limiti di risorse con parametri semplici.

Perché i container sono migliori delle macchine virtuali?

I container presentano alcuni vantaggi chiave rispetto alle macchine virtuali. Diamo un'occhiata a quelli.

Utilizzo e costo delle risorse

  1. Puoi utilizzare le VM per eseguire le tue applicazioni in modo indipendente, il che significa un servizio per VM. Ma può ancora essere sottoutilizzato. E il ridimensionamento di una VM non è un compito facile per un'applicazione di produzione.
  2. D'altra parte, i container possono essere eseguiti con requisiti minimi di CPU e memoria. Inoltre, puoi persino eseguire più contenitori all'interno di una macchina virtuale per la segregazione delle applicazioni. Inoltre, il ridimensionamento di un contenitore richiede pochi secondi.

Provisioning e distribuzione

  1. Il provisioning di una macchina virtuale e la distribuzione di applicazioni su di essa potrebbero richiedere da minuti a ore, a seconda del flusso di lavoro coinvolto. Anche il rollback richiede tempo.
  2. Ma puoi distribuire un container in pochi secondi e anche ripristinarlo in pochi secondi.

Gestione della deriva

  1. La gestione della deriva nelle macchine virtuali non è facile. È necessario disporre di automazione e processi completi per garantire che tutti gli ambienti siano simili. Seguire modelli di distribuzione immutabili evita la deriva negli ambienti VM.
  2. Una volta eseguito il backup dell'immagine, sarà la stessa in tutti gli ambienti per i container. Quindi, per qualsiasi modifica, devi iniziare ad apportare modifiche in dev env e riattivare l'immagine del contenitore.

Domande frequenti su Docker

Qual ​​è la differenza tra containerd e runc?

containerd è responsabile della gestione del container e runc è responsabile dell'esecuzione dei container (creare namespace, cgroup ed eseguire comandi all'interno del container) con gli input da containerd

Qual ​​è la differenza tra il motore Docker e il demone Docker?

Il motore Docker è composto dal daemon Docker, dall'interfaccia Rest e dalla CLI Docker. Docker daemon è il servizio dockerd di systemd responsabile della creazione delle immagini docker e dell'invio di istruzioni docker al runtime containerd.


Docker
  1. Cos'è NGINX? Come funziona?

  2. Che cos'è un server Web e come funziona un server Web?

  3. Che cos'è containerd e come si collega a Docker e Kubernetes?

  4. Come assegnare un IP statico a un contenitore Docker

  5. Come elencare i contenitori Docker

Che cos'è VDI e come funziona?

Apprendimento Docker:come creare un contenitore Docker

Come eseguire PHPMyAdmin in un contenitore Docker

Come eseguire Grafana in un contenitore Docker

Come configurare un container Docker Apache

Come funziona un sistema di bilanciamento del carico? Che cos'è il bilanciamento del carico?