Ich habe vor einigen Tagen von Docker gehört und wollte darüber hinweggehen.
Aber in der Tat weiß ich nicht, was der Zweck dieses "Containers" ist?
Was ist ein Container?
Kann es eine virtuelle Maschine ersetzen, die für die Entwicklung vorgesehen ist?
Was ist mit einfachen Worten der Zweck der Verwendung von Docker in Unternehmen? Der Hauptvorteil?
Antworten:
VM: Mit VM-Software kann Ubuntu beispielsweise in einem Windows installiert werden. Und sie würden beide gleichzeitig rennen. Es ist, als würde man einen PC mit seinen Kernkomponenten wie CPU, RAM, Festplatten, Netzwerkkarten usw. innerhalb eines Betriebssystems erstellen und so zusammenbauen, als wäre es ein echter PC. Auf diese Weise wird der virtuelle PC zu einem "Gast" innerhalb eines tatsächlichen PCs, der mit seinem Betriebssystem als Host bezeichnet wird.
Container: Es ist das gleiche wie oben, aber anstatt ein gesamtes Betriebssystem zu verwenden, wurden die "unnötigen" Komponenten des virtuellen Betriebssystems reduziert, um eine minimale Version davon zu erstellen. Dies führte zur Erstellung von LXC (Linux Containers). Es ist schneller als VM-Maschinen.
Docker: Ein Docker-Container benötigt im Gegensatz zu einer virtuellen Maschine und einem Container kein separates Betriebssystem. Stattdessen stützt es sich auf die Funktionalität des Linux-Kernels und verwendet die Ressourcenisolation.
Zweck von Docker: Der Hauptfokus liegt auf der Automatisierung der Bereitstellung von Anwendungen in Software-Containern und der Automatisierung der Virtualisierung auf Betriebssystemebene unter Linux. Es ist leichter als Standardcontainer und startet in Sekundenschnelle.
(Beachten Sie, dass im Fall von Docker kein Gastbetriebssystem erforderlich ist.)
quelle
[Hinweis: Diese Antwort konzentriert sich auf Linux-Container und gilt möglicherweise nicht vollständig für andere Betriebssysteme. ]]
Es ist eine App : Ein Container ist eine Möglichkeit, voneinander isolierte Anwendungen auszuführen. Anstatt die Hardware zu virtualisieren, um mehrere Betriebssysteme auszuführen, müssen Container das Betriebssystem virtualisieren, um mehrere Anwendungen auszuführen. Dies bedeutet, dass Sie mehr Container auf derselben Hardware als VMs ausführen können, da nur eine Kopie des Betriebssystems ausgeführt wird und Sie nicht für jede Instanz Ihrer App den Speicher und die CPU-Kerne vorab zuweisen müssen. Wie bei jeder anderen App werden sie von einem Container, der die CPU oder den Arbeitsspeicher benötigt, zugewiesen und anschließend freigegeben, sodass andere Apps später dieselben begrenzten Ressourcen verwenden können.
Sie nutzen Kernel-Namespaces : Jeder Container erhält standardmäßig eine Umgebung, in der die folgenden Namespaces vorhanden sind:
/
im Container unterscheiden sich von denen/
auf dem Host.Jeder dieser Namespaces verhindert auch, dass ein Container Dinge wie das Dateisystem oder Prozesse auf dem Host oder in anderen Containern sieht, es sei denn, Sie entfernen diese Isolation explizit.
Und andere Linux-Sicherheitstools : Container verwenden auch andere Sicherheitsfunktionen wie SELinux, AppArmor, Capabilities und Seccomp, um zu verhindern, dass Benutzer im Container, einschließlich des Root-Benutzers, dem Container entkommen oder den Host negativ beeinflussen können.
Packen Sie Ihre Apps mit ihren Abhängigkeiten für die Portabilität : Um eine Anwendung in einen Container zu packen, müssen Sie nicht nur die Anwendung selbst, sondern alle zum Ausführen dieser Anwendung erforderlichen Abhängigkeiten zu einem tragbaren Image zusammenfügen. Dieses Image ist das Basisdateisystem, mit dem ein Container erstellt wird. Da wir nur die Anwendung isolieren, enthält dieses Dateisystem nicht den Kernel und andere Betriebssystemdienstprogramme, die zum Virtualisieren eines gesamten Betriebssystems erforderlich sind. Daher sollte ein Image für einen Container erheblich kleiner sein als ein Image für eine gleichwertige virtuelle Maschine, damit die Bereitstellung auf Knoten im gesamten Netzwerk beschleunigt werden kann. Infolgedessen sind Container zu einer beliebten Option für die Bereitstellung von Anwendungen in der Cloud und in entfernten Rechenzentren geworden.
Dies hängt davon ab : Wenn in Ihrer Entwicklungsumgebung Linux ausgeführt wird und Sie entweder keinen Zugriff auf Hardwaregeräte benötigen oder ein direkter Zugriff auf die physische Hardware zulässig ist, ist die Migration in einen Linux-Container recht einfach. Das ideale Ziel für einen Docker-Container sind Anwendungen wie webbasierte APIs (z. B. eine REST-App), auf die Sie über das Netzwerk zugreifen.
Entwicklung oder Betrieb : Docker wird normalerweise auf einem von zwei Pfaden in eine Umgebung gebracht. Entwickler, die nach einer Möglichkeit suchen, ihre Anwendung schneller zu entwickeln und lokal zu testen, und Vorgänge, die mehr Arbeitslast auf weniger Hardware ausführen möchten, als dies mit virtuellen Maschinen möglich wäre.
Oder Entwickler : Eines der idealen Ziele besteht darin, Docker sofort über das CI / CD-Bereitstellungstool zu nutzen, die Anwendung zu kompilieren und sofort ein Image zu erstellen, das für Entwicklung, CI, Produkt usw. bereitgestellt wird. Container verkürzen häufig die Zeit zum Verschieben der Anwendung vom Einchecken des Codes bis zum Testen, wodurch Entwickler effizienter werden. Bei ordnungsgemäßem Design kann dasselbe Image, das von den Entwicklern und CI-Tools getestet und genehmigt wurde, in der Produktion bereitgestellt werden. Da dieses Image alle Anwendungsabhängigkeiten enthält, wird das Risiko eines Produktionsausfalls, der in der Entwicklung funktioniert hat, erheblich verringert.
Skalierbarkeit : Ein letzter wesentlicher Vorteil von Containern, den ich erwähnen werde, ist, dass sie unter Berücksichtigung der horizontalen Skalierbarkeit ausgelegt sind. Wenn Sie zustandslose Apps unter hoher Last haben, lassen sich Container aufgrund ihrer geringeren Bildgröße und des geringeren Overheads viel einfacher und schneller skalieren. Aus diesem Grund werden Container von vielen größeren webbasierten Unternehmen wie Google und Netflix verwendet.
quelle
Dieselben Fragen trafen mich vor einigen Tagen und was ich fand, nachdem ich mich darauf eingelassen hatte, lassen Sie uns in sehr einfachen Worten verstehen.
Nehmen wir ein Beispiel, in dem wir eine Anwendung mit den Diensten nodeJs, MongoDB, Redis, RabbitMQ usw. entwickeln [Sie können sich alle anderen Dienste vorstellen].
Jetzt sehen wir uns den folgenden Dingen als Probleme bei der Anwendungsentwicklung und im Versandprozess gegenüber, wenn wir die Existenz von Docker oder anderen Alternativen für Containerisierungsanwendungen vergessen.
Kompatibilität von Diensten (nodeJs, mongoDB, Redis, RabbitMQ usw.) mit dem Betriebssystem (selbst nachdem kompatible Versionen mit dem Betriebssystem gefunden wurden, müssen wir die Kompatibilität erneut überprüfen und beheben, wenn im Zusammenhang mit Versionen etwas Unerwartetes passiert).
Wenn für zwei Systemkomponenten eine Bibliothek / Abhängigkeit mit unterschiedlichen Versionen in der Anwendung im Betriebssystem erforderlich ist (dies muss jedes Mal neu überprüft werden, wenn ein unerwartetes Anwendungsverhalten aufgrund eines Problems mit der Bibliothek und der Abhängigkeitsversion auftritt).
Vor allem, wenn eine neue Person dem Team beitritt, fällt es uns sehr schwer, die neue Umgebung einzurichten. Die Person muss eine Vielzahl von Anweisungen befolgen und Hunderte von Befehlen ausführen, um die Umgebung endgültig einzurichten. Dies erfordert Zeit und Mühe.
Die Benutzer müssen sicherstellen, dass sie die richtige Version des Betriebssystems verwenden, und die Kompatibilität der Dienste mit dem Betriebssystem überprüfen. Jeder Entwickler muss dies jedes Mal beim Einrichten befolgen.
Wir haben auch unterschiedliche Umgebungen wie Entwicklung , Test und Produktion. Wenn ein Entwickler mit einem Betriebssystem vertraut ist und ein anderer mit einem anderen Betriebssystem vertraut ist, können wir in diesem Fall nicht garantieren, dass sich unsere Anwendung in diesen beiden unterschiedlichen Situationen gleich verhält .
All dies erschwert unser Leben bei der Entwicklung , dem Testen und dem Versand der Anwendungen.
Wir brauchen also etwas, das Kompatibilitätsprobleme löst und es uns ermöglicht, Änderungen und Modifikationen an jeder Systemkomponente vorzunehmen, ohne andere Komponenten zu beeinflussen.
Wie Docker die oben genannten Probleme löst
Wir können jede Dienstkomponente (nodeJs, MongoDB, Redis, RabbitMQ) in verschiedenen Containern mit eigenen Abhängigkeiten und Bibliotheken im selben Betriebssystem, aber mit unterschiedlichen Umgebungen ausführen .
Wir müssen die Docker-Konfiguration nur einmal ausführen, dann können alle unsere Teamentwickler mit dem einfachen Docker-Ausführungsbefehl beginnen. Wir haben hier viel Zeit und Mühe gespart :) .
Ich hoffe das wäre hilfreich.
quelle
Lassen Sie mich versuchen, so einfache Antworten wie möglich zu geben:
Was ist ein Container?
Einfach ausgedrückt: ein Paket mit Software . Insbesondere werden eine Anwendung und alle ihre Abhängigkeiten gebündelt. Eine reguläre, nicht dockerisierte Anwendungsumgebung ist direkt mit dem Betriebssystem verbunden, während ein Docker-Container eine Abstraktionsschicht des Betriebssystems ist.
Ein Container unterscheidet sich von einem Image dadurch, dass ein Container eine Laufzeitinstanz eines Images ist - ähnlich wie Objekte Laufzeitinstanzen von Klassen sind, falls Sie mit OOP vertraut sind.
Sowohl VMs als auch Docker-Container sind Virtualisierungstechniken, da sie eine Abstraktion über die Systeminfrastruktur hinaus bieten.
Auf einer VM wird ein vollständiges Gastbetriebssystem mit virtuellem Zugriff auf Hostressourcen über einen Hypervisor ausgeführt. Dies bedeutet, dass die VM der Umgebung häufig mehr Ressourcen zur Verfügung stellt, als sie tatsächlich benötigt. Im Allgemeinen stellen VMs einer Umgebung mehr Ressourcen zur Verfügung, als die meisten Anwendungen benötigen. Daher sind Behälter eine leichtere Technik. Die beiden lösen unterschiedliche Probleme.
Die Containerisierung geht Hand in Hand mit Microservices. Die kleineren Dienste, aus denen die größere Anwendung besteht, werden häufig getestet und in Docker-Containern ausgeführt. Dies erleichtert das kontinuierliche Testen.
Da Docker-Container schreibgeschützt sind, wird ein wichtiges DevOps-Prinzip durchgesetzt: Produktionsservices sollten unverändert bleiben
Einige allgemeine Vorteile ihrer Verwendung:
quelle