Cosa aggiunge Docker a lxc-tools (gli strumenti LXC dello spazio utente)?


398

Se dai un'occhiata alle funzionalità di Docker, molte di esse sono già fornite da LXC.

Quindi cosa aggiunge Docker? Perché dovrei usare Docker su LXC semplice?

Risposte:


550

Dalle domande frequenti su Docker :

Docker non è un sostituto di lxc. "lxc" si riferisce alle capacità del kernel linux (in particolare spazi dei nomi e gruppi di controllo) che consentono i processi sandboxing l'uno dall'altro e controllano le allocazioni delle risorse.

Oltre a questa base di basso livello delle funzionalità del kernel, Docker offre uno strumento di alto livello con diverse potenti funzionalità:

  • Distribuzione portatile su macchine.Docker definisce un formato per raggruppare un'applicazione e tutte le sue dipendenze in un singolo oggetto che può essere trasferito su qualsiasi macchina abilitata per docker ed eseguito lì con la garanzia che l'ambiente di esecuzione esposto all'applicazione sarà lo stesso. Lxc implementa il sandboxing di processo, che è un prerequisito importante per la distribuzione portatile, ma questo da solo non è sufficiente per la distribuzione portatile. Se mi inviassi una copia della tua applicazione installata in una configurazione lxc personalizzata, quasi certamente non funzionerebbe sulla mia macchina come fa sulla tua, perché è legata alla configurazione specifica della tua macchina: rete, archiviazione, registrazione, distribuzione, ecc. Docker definisce un'astrazione per queste impostazioni specifiche della macchina, in modo che lo stesso contenitore docker stesso possa funzionare - invariato - su molte macchine diverse,

  • Application-centric. Docker è ottimizzato per la distribuzione di applicazioni rispetto alle macchine. Ciò si riflette nella sua API, interfaccia utente, filosofia di progettazione e documentazione. Al contrario, gli script dell'helper di lxc si concentrano sui container come macchine leggere, sostanzialmente server che si avviano più velocemente e richiedono meno RAM. Pensiamo che ci sia qualcosa di più nei container oltre a quello.

  • Build automatico . Docker include uno strumento che consente agli sviluppatori di assemblare automaticamente un container dal loro codice sorgente, con il pieno controllo delle dipendenze delle applicazioni, strumenti di costruzione, packaging ecc. Sono liberi di usare make, maven, chef, puppet, salt, pacchetti debian, rpms, source tarball, o qualsiasi combinazione di quanto sopra, indipendentemente dalla configurazione delle macchine .

  • Versioning. Docker include funzionalità simili a git per il monitoraggio delle versioni successive di un contenitore, l'ispezione del diff tra le versioni, il commit di nuove versioni, il rollback, ecc. La cronologia include anche come un contenitore è stato assemblato e da chi, in modo da ottenere la tracciabilità completa dal server di produzione fino allo sviluppatore a monte. Docker implementa anche upload e download incrementali, simili a "git pull", quindi le nuove versioni di un container possono essere trasferite solo inviando diff.

  • Riutilizzo dei componenti. Qualsiasi contenitore può essere utilizzato come "immagine di base" per creare componenti più specializzati. Questo può essere fatto manualmente o come parte di una build automatizzata. Ad esempio, puoi preparare l'ambiente Python ideale e utilizzarlo come base per 10 diverse applicazioni. La tua configurazione postgresql ideale può essere riutilizzata per tutti i tuoi progetti futuri. E così via.

  • Condivisione. Docker ha accesso a un registro pubblico ( https://registry.hub.docker.com/ ) in cui migliaia di persone hanno caricato contenitori utili: qualsiasi cosa, dai redis, couchdb, postgres ai buttafuori irc ai server delle applicazioni rotaie per spostarsi su immagini di base per varie distro. Il registro include anche una "libreria standard" ufficiale di contenitori utili gestiti dal team di docker. Il registro stesso è open source, quindi chiunque può distribuire il proprio registro per archiviare e trasferire contenitori privati, ad esempio per distribuzioni di server interni.

  • Strumento ecosistema. Docker definisce un'API per automatizzare e personalizzare la creazione e la distribuzione di container. Esistono numerosi strumenti che si integrano con la finestra mobile per estenderne le capacità. Implementazione simile a PaaS (Dokku, Deis, Flynn), orchestrazione multi-nodo (maestro, salt, mesos, openstack nova), dashboard di gestione (docker-ui, openstack horizon, cantiere navale), gestione della configurazione (chef, burattino), integrazione continua (jenkins, strider, travis), ecc. Docker si sta rapidamente affermando come lo standard per gli utensili basati su container.

Spero che questo possa essere d'aiuto!


3
Quando dici "qualsiasi contenitore può essere usato come immagine di base", presumo tu intenda un contenitore Docker, non un contenitore LXC creato indipendentemente da Docker. Per quanto ne so, non è possibile creare un contenitore Docker da zero, deve sempre ereditare da un altro contenitore Docker (domanda correlata: stackoverflow.com/questions/18274088/… ).
Flimm,

18
Puoi facilmente creare un nuovo contenitore da qualsiasi tarball con "importazione docker". Ad esempio: "debootstrap raring ./rootfs; tar -C ./rootfs -c. | Docker import flimm / mybase".
Solomon Hykes,

3
è ancora vero ora che Docker ha libcontainer (che non è un rimpiazzo)?
Garet Claborn,

3
@GaretClaborn sì, dal momento che libcontainer è solo la propria libreria per accedere a spazi dei nomi e cgroups, tutto ciò che Solomon ha detto vale ancora.
John Morales,

10
Un contenitore Linux è il risultato del vincolo e dell'isolamento di un processo usando una serie di servizi Linux: chroot, cgroups e namespace. LXC è uno strumento per lo spazio utente che manipola tali servizi. libcontainer è un'alternativa a LXC che manipola le stesse strutture. Docker utilizza libcontainer per impostazione predefinita ma può invece utilizzare LXC. Detto questo, Docker è (molto) più di un livello di compatibilità oltre a libcontainer / LXC; aggiunge funzionalità aggiuntive che le altre risposte hanno elencato.
user100464

71

Diamo un'occhiata all'elenco delle caratteristiche tecniche di Docker e controlliamo quali sono fornite da LXC e quali no.

Caratteristiche:

1) Isolamento del filesystem : ogni container di processo viene eseguito in un filesystem di root completamente separato.

Fornito con LXC semplice.

2) Isolamento delle risorse : risorse di sistema come cpu e memoria possono essere allocate in modo diverso a ciascun contenitore di processo, usando cgroups.

Fornito con LXC semplice.

3) Isolamento della rete : ogni contenitore di processo viene eseguito nel proprio spazio dei nomi di rete, con un'interfaccia virtuale e un indirizzo IP propri.

Fornito con LXC semplice.

4) Copy-on-write : i filesystem di root sono creati usando copy-on-write, il che rende la distribuzione estremamente veloce, economica in termini di memoria e economica del disco.

Questo è fornito da AUFS, un filesystem sindacale da cui Docker dipende. È possibile configurare AUFS manualmente con LXC, ma Docker lo utilizza come standard.

5) Registrazione : i flussi standard (stdout / stderr / stdin) di ciascun contenitore di processo vengono raccolti e registrati per il recupero in tempo reale o in batch.

Docker fornisce questo.

6) Gestione delle modifiche: le modifiche al filesystem di un container possono essere inserite in una nuova immagine e riutilizzate per creare più container. Non è richiesta la configurazione manuale o del modello.

"Templating o configurazione manuale" è un riferimento a LXC, dove è necessario conoscere entrambe queste cose. Docker ti consente di trattare i contenitori come sei abituato a trattare le macchine virtuali, senza conoscere la configurazione di LXC.

7) Shell interattiva : la finestra mobile può allocare una pseudo-tty e collegarsi all'input standard di qualsiasi contenitore, ad esempio per eseguire una shell interattiva usa e getta.

LXC lo fornisce già.


Ho appena iniziato a conoscere LXC e Docker, quindi accolgo con favore eventuali correzioni o risposte migliori.


35
IMHO, questa risposta manca il punto. Docker non "fornisce" tali funzionalità; li rende semplicemente banalmente facili da usare. Se vogliamo essere pignoli, possiamo dire che LXC non fornisce isolamento: gli spazi dei nomi lo forniscono, e LXC è solo uno strumento di userland delle materie prime per renderli più facili da usare rispetto allo unsharestrumento di base (o direttamente alla clone()syscall). Allo stesso modo, Docker rende queste cose più facili da usare (e porta molte più funzionalità sul tavolo, come la possibilità di spingere / tirare le immagini). Il mio 2c.
jpetazzo,

6
@jpetazzo: LXC è in realtà abbastanza semplice, come rende Docker più semplice (oltre ad aggiungere altre funzionalità come spingere e tirare le immagini)?
Flimm,

31
@Flimm: mi piace il confronto nel numero 16 di Admin Magazine , p. 34: Docker raggruppa LXC insieme ad altre tecnologie di supporto e lo avvolge in un'interfaccia a riga di comando facile da usare. Utilizzando contenitori è un po 'come cercare di usare Git con i comandi proprio come update-indexe read-tree, senza strumenti familiari come add, commite merge. Docker fornisce quello strato di "porcellana" rispetto all '"impianto idraulico" di LXC, consentendoti di lavorare con concetti di livello superiore e preoccuparti meno dei dettagli di basso livello.
0xC0000022L

4
Ho eseguito benchmark UnixBench all'interno di un container docker e LXC, eseguendo lo stesso sistema operativo, e LXC si è distinto per il punteggio. Essendo docker basato su LXC, sono molto perplesso sui miei risultati.
gextra,

7
Mi sembra che le prestazioni più lente di Docker fossero legate all'I / O del disco, quindi forse dovute all'adozione di AUFS.
gextra,

16

I post e le risposte di cui sopra stanno rapidamente diventando obsoleti poiché lo sviluppo di LXD continua a migliorare LXC . Sì, lo so che Docker non si è ancora fermato.

LXD ora implementa un repository per le immagini del contenitore LXC da cui un utente può spingere / estrarre per contribuire o riutilizzare.

L'API REST di LXD a LXC ora consente la creazione / distribuzione / gestione locale e remota di contenitori LXC usando una sintassi del comando molto semplice.

Le caratteristiche principali di LXD sono:

  • Sicuro in base alla progettazione (contenitori non privilegiati, restrizioni delle risorse e molto altro)
  • Scalabile (dai contenitori sul laptop a migliaia di nodi di calcolo)
  • Intuitivo (API semplice, chiara ed esperienza della riga di comando nitida)
  • Basato su immagini (non più modelli di distribuzione, solo immagini valide e affidabili) Migrazione in tempo reale

Ora esiste un plug-in NCLXD per OpenStack che consente a OpenStack di utilizzare LXD per distribuire / gestire i contenitori LXC come macchine virtuali in OpenStack invece di utilizzare KVM, vmware ecc.

Tuttavia, NCLXD abilita anche un cloud ibrido di un mix di VM HW tradizionali e VM LXC.

Nel plug-in nclxd di OpenStack un elenco di funzionalità supportate include:

stop/start/reboot/terminate container
Attach/detach network interface
Create container snapshot
Rescue/unrescue instance container
Pause/unpause/suspend/resume container
OVS/bridge networking
instance migration
firewall support

Quando Ubuntu 16.04 sarà rilasciato nell'aprile 2016, ci sarebbero state ulteriori interessanti funzioni come il supporto del dispositivo a blocchi, il supporto della migrazione in tempo reale .


4

I docker usano immagini che sono costruite a strati. Ciò aggiunge molto in termini di portabilità, condivisione, controllo delle versioni e altre funzionalità. Queste immagini sono molto facili da trasferire o trasferire e poiché sono a strati, le modifiche nelle versioni successive vengono aggiunte sotto forma di livelli rispetto ai livelli precedenti. Pertanto, durante il porting più volte non è necessario eseguire il porting dei livelli di base. I docker dispongono di contenitori che eseguono queste immagini con l'ambiente di esecuzione contenuto, aggiungono modifiche come nuovi livelli che forniscono un facile controllo della versione.

A parte questo Docker Hub è un buon registro con migliaia di immagini pubbliche, dove è possibile trovare immagini con sistema operativo e altri software installati. Quindi, puoi ottenere un buon vantaggio per la tua applicazione.


Quando dici "livelli integrati" - che cosa significa - (A) Una copia dei livelli base, adattata e impegnata in un livello "NUOVO". Quindi, il livello base è disconnesso dal successivo? (B) I layer di base sono / sono inclusi nel layer "NEW" e sono anche collegati. Pertanto, le modifiche al livello base vengono automaticamente riflesse sul livello "NUOVO". Spiacenti, se il chiarimento richiesto è troppo ingenuo. :( Kapil
Kapil l'

Le immagini Docker sono integrate in livelli. Per mettere in termini granulari tutte le modifiche fino a un punto quando viene commesso un livello sono presenti negli strati dell'immagine fatti fino a quel punto. Tutte le modifiche apportate successivamente vengono aggiunte ai livelli successivo e superiore. Pertanto, il nuovo livello è collegato al livello base. Non penso che lo stesso nuovo livello possa essere aggiunto a un livello base diverso con ulteriori modifiche. Tuttavia, se più entità desiderano mantenere la coerenza e avere gli stessi livelli base, è necessario assegnare a queste entità solo i nuovi livelli per raggiungere lo stesso stato.
div

Tuttavia, non sono aggiornato sugli sviluppi attuali sulla finestra mobile e potrebbero esserci delle modifiche all'implementazione dell'immagine della finestra mobile che non sono trattate nel commento precedente.
div

Per essere più specifici, i livelli sono identificati da una firma (SHA-qualcosa, credo), il che significa che se si modifica un livello, si tratta di un livello diverso. @Kapil: ciò significa che mentre il suo comportamento è un po 'più vicino alla tua opzione (B), in realtà non puoi apportare modifiche a un livello base. (o qualsiasi livello, per quella materia) Un'immagine è costruita da un elenco di livelli, ognuno applicato in ordine; i layer possono essere ripuliti (e penso che vengano automaticamente ripuliti dalla stessa finestra mobile) quando non sono più necessari; cioè, quando tutte le immagini di riferimento sono state eliminate.
codermonkeyfuel,

@Kapil: Onestamente, la tua domanda probabilmente funzionerebbe meglio come una nuova domanda, invece che come commento su questo, dal momento che è utile che le persone possano cercare da sole. Se vuoi porlo come una nuova domanda, risponderò anche lì.
codermonkeyfuel,

0

Andando a mantenere questo pietrisco, questo è già stato chiesto e risposto sopra .

Farei un passo indietro e risponderei in modo leggermente diverso, lo stesso motore docker aggiunge l'orchestrazione come uno dei suoi extra e questa è la parte dirompente. Una volta che inizi a eseguire un'app come una combinazione di contenitori che girano "da qualche parte" su più motori contenitore, diventa davvero eccitante. Robustezza, ridimensionamento orizzontale, completa astrazione dall'hardware sottostante, potrei andare avanti all'infinito ...

Non è solo Docker a darti questo, in effetti lo standard di fatto Container Orchestration è Kubernetes che ha molti gusti, uno Docker, ma anche OpenShift, SuSe, Azure, AWS ...

Sotto K8S ci sono motori container alternativi; quelli interessanti sono Docker e CRIO - di recente costruzione, senza demone, intesi come motore container appositamente per Kubernetes ma immaturi. È la concorrenza tra questi che penso sarà la vera scelta a lungo termine per un motore container.

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.