Risposte:
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!
Diamo un'occhiata all'elenco delle caratteristiche tecniche di Docker e controlliamo quali sono fornite da LXC e quali no.
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.
unshare
strumento 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.
update-index
e read-tree
, senza strumenti familiari come add
, commit
e 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.
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:
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 .
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.
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.