Was fügt Docker lxc-tools (den LXC-Tools für den Benutzerbereich) hinzu?

398

Wenn Sie sich die Funktionen von Docker ansehen, werden die meisten bereits von LXC bereitgestellt.

Was fügt Docker hinzu? Warum sollte ich Docker über normales LXC verwenden?

Flimm
quelle

Antworten:

550

Aus den Docker-FAQ :

Docker ist kein Ersatz für lxc. "lxc" bezieht sich auf Funktionen des Linux-Kernels (insbesondere Namespaces und Kontrollgruppen), die Sandboxing-Prozesse voneinander ermöglichen und deren Ressourcenzuweisungen steuern.

Zusätzlich zu dieser einfachen Grundlage für Kernel-Funktionen bietet Docker ein High-Level-Tool mit mehreren leistungsstarken Funktionen:

  • Portable Bereitstellung auf mehreren Computern.Docker definiert ein Format zum Bündeln einer Anwendung und aller ihrer Abhängigkeiten in einem einzigen Objekt, das auf jeden Docker-fähigen Computer übertragen und dort ausgeführt werden kann, mit der Garantie, dass die der Anwendung zur Verfügung gestellte Ausführungsumgebung dieselbe ist. Lxc implementiert Prozess-Sandboxing, eine wichtige Voraussetzung für die tragbare Bereitstellung, die jedoch für die tragbare Bereitstellung allein nicht ausreicht. Wenn Sie mir eine Kopie Ihrer Anwendung senden, die in einer benutzerdefinierten lxc-Konfiguration installiert ist, wird sie mit ziemlicher Sicherheit nicht so auf meinem Computer ausgeführt wie auf Ihrem, da sie an die spezifische Konfiguration Ihres Computers gebunden ist: Netzwerk, Speicher, Protokollierung, Distribution, usw. Docker definiert eine Abstraktion für diese maschinenspezifischen Einstellungen, sodass genau derselbe Docker-Container - unverändert - auf vielen verschiedenen Computern ausgeführt werden kann.

  • Anwendungsorientiert. Docker ist im Gegensatz zu Maschinen für die Bereitstellung von Anwendungen optimiert . Dies spiegelt sich in der API, der Benutzeroberfläche, der Designphilosophie und der Dokumentation wider. Im Gegensatz dazu konzentrieren sich die lxc-Hilfsskripte auf Container als leichte Maschinen - im Grunde genommen Server, die schneller booten und weniger RAM benötigen. Wir denken, dass Container mehr als nur das sind.

  • Automatischer Build . Docker enthält ein Tool, mit dem Entwickler automatisch einen Container aus ihrem Quellcode zusammenstellen können, mit vollständiger Kontrolle über Anwendungsabhängigkeiten, Build-Tools, Verpackung usw. Sie können make, maven, chef, Marionette, Salt, Debian-Pakete, RPMs und Source verwenden Tarballs oder eine beliebige Kombination der oben genannten, unabhängig von der Konfiguration der Maschinen .

  • Versionierung. Docker enthält git-ähnliche Funktionen zum Verfolgen aufeinanderfolgender Versionen eines Containers, zum Überprüfen des Unterschieds zwischen Versionen, zum Festschreiben neuer Versionen, zum Zurücksetzen usw. Der Verlauf enthält auch, wie und von wem ein Container zusammengestellt wurde, sodass Sie die vollständige Rückverfolgbarkeit vom Produktionsserver erhalten den ganzen Weg zurück zum Upstream-Entwickler. Docker implementiert auch inkrementelle Uploads und Downloads, ähnlich wie "git pull", sodass neue Versionen eines Containers nur durch Senden von Diffs übertragen werden können.

  • Wiederverwendung von Komponenten. Jeder Container kann als "Basis-Image" verwendet werden, um speziellere Komponenten zu erstellen. Dies kann manuell oder als Teil eines automatisierten Builds erfolgen. Sie können beispielsweise die ideale Python-Umgebung vorbereiten und als Basis für 10 verschiedene Anwendungen verwenden. Ihr ideales Postgresql-Setup kann für alle Ihre zukünftigen Projekte wiederverwendet werden. Und so weiter.

  • Teilen. Docker hat Zugriff auf eine öffentliche Registrierung ( https://registry.hub.docker.com/ ), in die Tausende von Menschen nützliche Container hochgeladen haben: alles von Redis, Couchdb, Postgres über IRC-Bouncer bis hin zu Rails-App-Servern, um Bilder zu erstellen verschiedene Distributionen. Die Registrierung enthält auch eine offizielle "Standardbibliothek" nützlicher Container, die vom Docker-Team verwaltet werden. Die Registrierung selbst ist Open Source, sodass jeder seine eigene Registrierung bereitstellen kann, um private Container zu speichern und zu übertragen, beispielsweise für interne Serverbereitstellungen.

  • Werkzeug-Ökosystem. Docker definiert eine API zum Automatisieren und Anpassen der Erstellung und Bereitstellung von Containern. Es gibt eine Vielzahl von Tools, die in Docker integriert sind, um dessen Funktionen zu erweitern. PaaS-ähnliche Bereitstellung (Dokku, Deis, Flynn), Orchestrierung mit mehreren Knoten (Maestro, Salt, Mesos, Openstack Nova), Management-Dashboards (Docker-UI, Openstack-Horizont, Werft), Konfigurationsmanagement (Chef, Marionette), kontinuierliche Integration (Jenkins, Strider, Travis) usw. Docker etabliert sich schnell als Standard für containergestützte Werkzeuge.

Ich hoffe das hilft!

Solomon Hykes
quelle
3
Wenn Sie sagen, "jeder Container kann als Basis-Image verwendet werden", meinen Sie vermutlich einen Docker-Container, keinen LXC-Container, der unabhängig von Docker erstellt wurde. Soweit ich das beurteilen kann, kann man einen Docker-Container nicht von Grund auf neu erstellen, er muss immer von einem anderen Docker-Container erben (verwandte Frage: stackoverflow.com/questions/18274088/… ).
Flimm
18
Mit "Docker-Import" können Sie ganz einfach einen neuen Container aus jedem Tarball erstellen. Zum Beispiel: "debootstrap raring ./rootfs; tar -C ./rootfs -c. | Docker import flimm / mybase".
Solomon Hykes
3
Trifft dies jetzt noch zu, da Docker libcontainer hat (dass es kein Ersatz ist)?
Garet Claborn
3
@GaretClaborn Ja, da libcontainer nur eine eigene Bibliothek für den Zugriff auf Namespaces und cgroups ist, gilt immer noch alles, was Solomon gesagt hat.
John Morales
10
Ein Linux-Container ist das Ergebnis der Einschränkung und Isolierung eines Prozesses mithilfe einer Reihe von Linux-Funktionen: chroot, cgroups und Namespaces. LXC ist ein Userspace-Tool, das diese Funktionen bearbeitet. libcontainer ist eine Alternative zu LXC, die dieselben Funktionen manipuliert. Docker verwendet standardmäßig libcontainer, kann jedoch stattdessen LXC verwenden. Das heißt, Docker ist (viel) mehr als eine Kompatibilitätsschicht über libcontainer / LXC; Es werden zusätzliche Funktionen hinzugefügt, die in den anderen Antworten aufgeführt sind.
user100464
71

Werfen wir einen Blick auf die Liste der technischen Funktionen von Docker und prüfen, welche von LXC bereitgestellt werden und welche nicht.

Eigenschaften:

1) Dateisystemisolation : Jeder Prozesscontainer wird in einem vollständig separaten Root-Dateisystem ausgeführt.

Mit einfachem LXC versehen.

2) Ressourcenisolierung : Systemressourcen wie CPU und Speicher können mithilfe von cgroups jedem Prozesscontainer unterschiedlich zugewiesen werden.

Mit einfachem LXC versehen.

3) Netzwerkisolation : Jeder Prozesscontainer wird in einem eigenen Netzwerk-Namespace mit einer eigenen virtuellen Schnittstelle und IP-Adresse ausgeführt.

Mit einfachem LXC versehen.

4) Copy-on-Write : Root-Dateisysteme werden mithilfe von Copy-on-Write erstellt, wodurch die Bereitstellung extrem schnell, speicher- und festplattenmäßig ist.

Dies wird von AUFS bereitgestellt, einem Union-Dateisystem, von dem Docker abhängt. Sie können AUFS selbst manuell mit LXC einrichten, Docker verwendet es jedoch als Standard.

5) Protokollierung : Die Standard-Streams (stdout / stderr / stdin) jedes Prozesscontainers werden gesammelt und für den Echtzeit- oder Batch-Abruf protokolliert.

Docker bietet dies.

6) Änderungsverwaltung : Änderungen am Dateisystem eines Containers können in ein neues Image übernommen und zum Erstellen weiterer Container wiederverwendet werden. Keine Vorlage oder manuelle Konfiguration erforderlich.

"Vorlagen oder manuelle Konfiguration" bezieht sich auf LXC, wo Sie beide Dinge lernen müssen. Mit Docker können Sie Container so behandeln, wie Sie es von virtuellen Maschinen gewohnt sind, ohne sich mit der LXC-Konfiguration vertraut zu machen.

7) Interaktive Shell : Docker kann eine Pseudo-Tty zuweisen und an die Standardeingabe eines beliebigen Containers anhängen, um beispielsweise eine interaktive Wegwerf-Shell auszuführen.

LXC bietet dies bereits an.


Ich habe gerade erst angefangen, etwas über LXC und Docker zu lernen, daher würde ich Korrekturen oder bessere Antworten begrüßen.

Flimm
quelle
35
IMHO, diese Antwort verfehlt den Punkt. Docker "bietet" diese Funktionen nicht an. es macht sie lediglich trivial einfach zu bedienen. Wenn wir pingelig sein wollen, können wir sagen, dass LXC keine Isolation bietet: Namespaces bieten dies, und LXC ist nur ein Standard-Userland-Tool, mit dem sie einfacher zu verwenden sind als mit dem Basis- unshareTool (oder direkt mit dem clone()Syscall). Ebenso vereinfacht Docker die Verwendung dieser Dinge (und bringt viele weitere Funktionen auf den Tisch, z. B. die Möglichkeit, Bilder zu verschieben / zu ziehen). Mein 2c.
Jpetazzo
6
@jpetazzo: LXC ist eigentlich ziemlich einfach. Wie macht Docker es einfacher (neben dem Hinzufügen weiterer Funktionen wie dem Schieben und Ziehen von Bildern)?
Flimm
31
@Flimm: Ich mag den Vergleich in Ausgabe 16 des Admin Magazins , S. 22 . 34: Docker bündelt LXC zusammen mit einigen anderen unterstützenden Technologien und verpackt es in eine benutzerfreundliche Befehlszeilenschnittstelle. Mit Container ist ein bisschen wie der Versuch , Git mit nur Befehlen wie zu benutzen update-indexund read-treeohne bekannte Tools wie add, commit, und merge. Docker bietet diese Schicht aus "Porzellan" über der "Installation" von LXC, sodass Sie mit Konzepten auf höherer Ebene arbeiten und sich weniger um Details auf niedriger Ebene kümmern müssen.
0xC0000022L
4
Ich habe UnixBench-Benchmarks in einem Docker-Container und einem LXC-Container mit demselben Betriebssystem ausgeführt, und LXC hat eine hervorragende Punktzahl erzielt. Als Docker auf LXC-Basis bin ich sehr verwirrt über meine Ergebnisse.
Gextra
7
Es scheint mir, dass die langsamere Leistung von Docker mit der Festplatten-E / A zusammenhängt, was möglicherweise auf die Einführung von AUFS zurückzuführen ist.
Gextra
16

Die obigen Beiträge und Antworten werden schnell veraltet, da die Entwicklung von LXD LXC weiter verbessert . Ja, ich weiß, dass Docker auch nicht stehen geblieben ist.

LXD implementiert jetzt ein Repository für LXC-Container-Images, aus dem ein Benutzer Push / Pull ziehen kann, um einen Beitrag zu leisten oder ihn wiederzuverwenden.

Die REST-API von LXD für LXC ermöglicht jetzt sowohl die lokale als auch die Remote- Erstellung / Bereitstellung / Verwaltung von LXC-Containern mithilfe einer sehr einfachen Befehlssyntax.

Hauptmerkmale von LXD sind:

  • Sicher durch Design (nicht privilegierte Container, Ressourcenbeschränkungen und vieles mehr)
  • Skalierbar (von Containern auf Ihrem Laptop bis zu Tausenden von Rechenknoten)
  • Intuitiv (einfache, übersichtliche API und gestochen scharfe Befehlszeilenerfahrung)
  • Bildbasiert (keine Verteilungsvorlagen mehr, nur gute, vertrauenswürdige Bilder) Live-Migration

Es gibt jetzt ein NCLXD-Plugin für OpenStack, mit dem OpenStack LXD zum Bereitstellen / Verwalten von LXC-Containern als VMs in OpenStack verwenden kann, anstatt KVM, VMware usw. zu verwenden.

NCLXD ermöglicht jedoch auch eine Hybrid-Cloud aus einer Mischung traditioneller HW-VMs und LXC-VMs.

Das OpenStack nclxd-Plugin enthält eine Liste der unterstützten Funktionen:

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

Bis zur Veröffentlichung von Ubuntu 16.04 im April 2016 wird es weitere coole Funktionen wie Blockgeräteunterstützung und Live-Migrationsunterstützung geben .

bmullan
quelle
4

Docker verwenden Bilder, die in Ebenen erstellt wurden. Dies trägt wesentlich zur Portabilität, Freigabe, Versionierung und anderen Funktionen bei. Diese Bilder lassen sich sehr einfach portieren oder übertragen. Da sie sich in Ebenen befinden, werden Änderungen in nachfolgenden Versionen in Form von Ebenen gegenüber vorherigen Ebenen hinzugefügt. Während Sie also mehrmals portieren, müssen Sie die Basisebenen nicht portieren. Docker verfügen über Container, in denen diese Images mit einer enthaltenen Ausführungsumgebung ausgeführt werden. Sie fügen Änderungen als neue Ebenen hinzu und bieten so eine einfache Versionskontrolle.

Abgesehen davon ist Docker Hub eine gute Registrierung mit Tausenden von öffentlichen Images, in denen Sie Images finden können, auf denen Betriebssystem und andere Software installiert sind. So erhalten Sie einen ziemlich guten Vorsprung für Ihre Bewerbung.

div
quelle
Wenn Sie "eingebaute Ebenen" sagen - was bedeutet das - (A) Eine Kopie der Basisebenen, angepasst und an eine "NEUE" Ebene gebunden. Also ist die Basisschicht von der nächsten getrennt? (B) Die Basisschicht (en) sind / sind in der "NEUEN" Schicht enthalten und auch verknüpft. Änderungen an der Basisebene werden also automatisch in die "NEUE" Ebene übernommen. Entschuldigung, wenn die gesuchte Klarstellung zu naiv ist. :( Kapil
Kapil
Docker-Images werden in Ebenen erstellt. Um es detailliert auszudrücken: Alle Änderungen bis zu einem Punkt, an dem eine Ebene festgeschrieben wird, sind in Bildebenen vorhanden, die bis zu diesem Punkt erstellt wurden. Alle danach vorgenommenen Änderungen werden den nächsten und höheren Ebenen hinzugefügt. Daher wird eine neue Ebene mit der Basisschicht verknüpft. Ich glaube nicht, dass dieselbe neue Ebene mit zusätzlichen Änderungen zu einer anderen Basisebene hinzugefügt werden kann. Wenn jedoch mehrere Entitäten die Konsistenz beibehalten und dieselben Basisebenen haben möchten, müssen diesen Entitäten nur die neuen Ebenen zugewiesen werden, um denselben Status zu erreichen.
Div
Ich bin jedoch nicht über die aktuellen Entwicklungen bei Docker informiert, und es kann Änderungen an der Docker-Image-Implementierung geben, die im obigen Kommentar nicht behandelt werden.
Div
Genauer gesagt werden Ebenen durch eine Signatur (SHA-etwas, glaube ich) gekennzeichnet. Wenn Sie also eine Ebene ändern, handelt es sich um eine andere Ebene. @Kapil: Das bedeutet, dass das Verhalten Ihrer Option (B) zwar etwas näher kommt, Sie jedoch keine Änderungen an einer Basisebene vornehmen können. (oder eine beliebige Ebene) Ein Bild wird aus einer Liste von Ebenen erstellt, die jeweils nacheinander angewendet werden. Ebenen können bereinigt werden (und ich denke, sie werden automatisch vom Docker selbst bereinigt), wenn sie nicht mehr benötigt werden. dh wenn alle referenzierenden Bilder gelöscht wurden.
Codermonkeyfuel
@Kapil: Ehrlich gesagt würde Ihre Frage wahrscheinlich am besten als neue Frage funktionieren, anstatt als Kommentar zu dieser Frage, da es nützlich ist, wenn die Leute selbst nachschlagen können. Wenn Sie es als neue Frage stellen möchten, werde ich auch dort antworten.
Codermonkeyfuel
0

Gehen diese prägnanter zu halten, wird dies bereits gestellt und beantwortet oben .

Ich würde jedoch einen Schritt zurücktreten und etwas anders antworten. Die Docker-Engine selbst fügt Orchestrierung als eines ihrer Extras hinzu, und dies ist der störende Teil. Sobald Sie eine App als Kombination von Containern ausführen, die "irgendwo" in mehreren Container-Engines ausgeführt werden, wird es wirklich aufregend. Robustheit, horizontale Skalierung, vollständige Abstraktion von der zugrunde liegenden Hardware, ich könnte weiter und weiter ...

Es ist nicht nur Docker, der Ihnen dies bietet. Der De-facto-Standard für Container-Orchestrierung ist Kubernetes, das in vielen Varianten erhältlich ist, eine Docker-Version, sondern auch OpenShift, SuSe, Azure, AWS ...

Dann gibt es unter K8S alternative Containermotoren; Die interessanten sind Docker und CRIO - kürzlich gebaut, daemonless, als Container-Engine speziell für Kubernetes gedacht, aber unausgereift. Es ist die Konkurrenz zwischen diesen, von der ich denke, dass sie die echte langfristige Wahl für einen Containermotor sein wird.

Will Rothwell
quelle