Che cos'è un contenitore?


23

Ci sono alcune domande sui contenitori , come:

Le mie domande :

  • Cosa è in realtà un "contenitore" (nel contesto di DevOps)?
  • Perché sono usati?

Risposte:


18

La prima cosa da sapere su un contenitore è:

È innanzitutto un processo.

Una volta capito, si può iniziare a capire come i contenitori si confrontano e contrastano con le macchine virtuali. Container e VM condividono entrambi l' isolamento dai loro host. Il metodo di isolamento è la differenza critica.

I processi contenitore utilizzano estensioni all'host del kernel del sistema operativo su cui vengono eseguiti per isolarsi da altri processi. Altre estensioni forniscono anche l'isolamento del disco e delle risorse. I container condividono il loro kernel e la memoria con il sistema operativo host.

Le macchine virtuali utilizzano un hypervisor per isolare le macchine virtuali dai loro host. Questo è un livello di software che inoltra richieste di risorse da "guest" (VM) all'hardware. L'isolamento del disco è fornito dalla virtualizzazione del disco. Le macchine virtuali non condividono un kernel con l'host, ma caricano i propri kernel nello spazio di memoria dedicato alla macchina virtuale.

Un importante impatto di questa differenza è che un contenitore deve essere compatibile con il kernel con il suo host. Ad esempio, non è possibile eseguire un contenitore basato su Windows Nano Server su un host Linux o un contenitore Ubuntu direttamente su un host Windows. Le macchine virtuali, al contrario, possono eseguire qualsiasi kernel indipendentemente dal sistema operativo host. Quando si esegue un contenitore Linux su un host Windows, Docker esegue il contenitore in una macchina virtuale Linux.

Le differenze operative sono nell'agilità: i contenitori si avviano e si arrestano più rapidamente di un normale processo. Le macchine virtuali sono "più pesanti" e richiedono risorse dedicate riservate a loro e impiegano più tempo per avviarsi e spegnersi.

I container offrono molta flessibilità a un modello operativo DevOps:

  • I contenitori isolano le dipendenze dei componenti software. Gli sviluppatori possono utilizzare i container per garantire che un modulo applicativo funzionerà anche sulle loro macchine di sviluppo come in QA / UA / Production
  • I contenitori utilizzano reti definite dal software per comunicare
  • Le definizioni dei contenitori sono dichiarative e possono essere controllate dal codice sorgente
  • I sistemi di gestione dei container (Kubernetes, DC / OS, Swarm) possono gestire pool di risorse hardware (calcolo / RAM / archiviazione) e ridimensionare dinamicamente i container

1
Faccio anche i tuoi 3 ultimi punti
elenco

8

La parola contenitore si riferisce a una tecnologia di virtualizzazione leggera disponibile sui moderni kernel Linux, questa tecnologia è molto simile alle jail di FreeBSD.

Un kernel Linux precedente, non capace di container, è in grado di eseguire processi contemporaneamente. Alcuni attributi del sistema sono privati ​​da elaborare, come l'ambiente di processo o la memoria di processo: solo il processo che possiede questi attributi e il sistema operativo stesso sono in grado di accedere a questi dati. (Ci sono molte lacune, come alcune implementazioni di ps , ma questo è essenzialmente vero!) Alcuni altri attributi sono condivisi tra i processi, come ad esempio il filesystem e le interfacce di rete.

Un kernel Linux moderno, capace di container, è in grado di gestire più attributi del sistema come dati privati ​​associati a un processo o un gruppo di processi. Il contesto risultante è un contenitore e invece di eseguire un programma nei "contenitori iniziali" utilizzando il filesystem e le interfacce di rete inizializzate dal sistema operativo, è possibile eseguire processi in altri contenitori, in modo che vedano un diverso filesystem e un diverso elenco di interfacce di rete. Pertanto, due processi in esecuzione in contenitori distinti condividono realmente il kernel. Forse hai familiarità con il comando chroot che può eseguire un processo in una gerarchia di file distinta, i contenitori portano l'idea un passo avanti.

Naturalmente, questa è solo una spiegazione molto approssimativa, ma spero che aiuti a chiarire l'idea di cosa siano i contenitori. Ora, a cosa servono?

Un'interfaccia popolare per le capacità del contenitore dei kernel Linux è implementata da docker, un'utilità della riga di comando che può essere utilizzata per produrre artefatti che rappresentano file system ( immagini docker ) ed eseguire processi in contenitori in cui questi file system sono accessibili. Questa suite di software è anche in grado di creare sistemi di rete virtuale ad hoc per consentire a diversi contenitori di comunicare su una rete privata.

Le tecnologie basate su container sono convenienti per:

  • Descrivere distribuzioni complesse scalabili .
  • Fornire agli sviluppatori di applicazioni un ambiente molto simile all'ambiente di produzione.
  • Implementa un modello di server immutabile, poiché gli artefatti software in genere descrivono un sistema operativo completo, non solo un pacchetto applicativo.

(Se hai familiarità con altre tecnologie di virtualizzazione come Virtual Box, potresti notare che queste tecnologie possono anche affrontare convenientemente i tre punti sopra. Oggi, c'è un piccolo spettro di tecnologie di virtualizzazione e possiamo confrontare la questione della loro popolarità in alcuni contesti con la popolarità dei linguaggi informatici: dipende probabilmente dai meriti tecnici di ogni singola soluzione, ma anche da molti fattori che etichetterò semplicemente "possibilità".)


1
Non più limitato a Linux, Windows 16 ha lo stesso tipo di abilità
Tensibai il


7

Di solito i contenitori si riferiscono a qualcosa come i contenitori docker che hanno reso popolare il nome

Cito lì dalla definizione docker:

Utilizzando i contenitori, tutto ciò che è necessario per eseguire un pezzo di software viene impacchettato in contenitori isolati. A differenza delle macchine virtuali, i contenitori non raggruppano un sistema operativo completo: sono necessarie solo le librerie e le impostazioni necessarie per far funzionare il software.

Il nome principale deriva dai container Linux (lxc) il cui obiettivo era isolare un processo dal suo sistema host, il primo obiettivo era evitare la compromissione del processo per assumere il controllo del sistema host.

Ora sono utilizzati in un ambito più ampio. In una moderna definizione di "contenitore", rilascerai più o meno un pacchetto per il runtime che già include la tua applicazione, è il middleware sottostante se necessario e tutte le librerie necessarie e assicurati che funzionerà su qualsiasi sistema compatibile.

Il secondo vantaggio è che consente di utilizzare più applicazioni con la stessa dipendenza in versioni diverse senza dover modificare pesantemente le sue variabili di ambiente in modo da caricare quella corretta.

Difficilmente a un sistema VM come una macchina virtuale a scatola virtuale o un'istanza EC2 su AWS, i contenitori sono virtuali solo a livello di file system e isolati solo nello stack di memoria. Condividono ancora lo stesso host e il sistema operativo sotto di loro arbitrerà i tick della CPU.

Una macchina virtuale è virtuale a livello hardware e si esegue un sistema operativo all'interno, un contenitore è virtuale a livello di sistema operativo e si esegue un processo all'interno.


1
Quindi, qualcosa come un'immagine di VirtualBox (o qualunque cosa venga chiamata in VirtualBox) potrebbe anche qualificarsi come "contenitore", o non capisco?
Pierre.Vriens

Ho visto che avevo dimenticato una parte della domanda, ho aggiunto la differenza estendendo la risposta.
Tensibai,

3

Dalla definizione di AWS :

I contenitori sono un metodo di virtualizzazione del sistema operativo che consente di eseguire un'applicazione e le sue dipendenze in processi isolati dalle risorse. I contenitori consentono di impacchettare facilmente il codice, le configurazioni e le dipendenze di un'applicazione in blocchi di facile utilizzo che offrono coerenza ambientale, efficienza operativa, produttività degli sviluppatori e controllo della versione. I contenitori possono aiutare a garantire che le applicazioni vengano distribuite in modo rapido, affidabile e coerente indipendentemente dall'ambiente di distribuzione. I container offrono inoltre un controllo più granulare delle risorse, migliorando l'efficienza dell'infrastruttura.

Il container è il confezionamento di tutte le necessità essenziali necessarie per svolgere un determinato compito / ambiente in modo che sia autosufficiente e possa essere eseguito su qualsiasi piattaforma, il che toglie molto dolore, quando si tratta di impostare e installare roba.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.