2014-07-11 28 views
42

Angenommen, ich beginne eine große Anzahl von Docker Container, die auf dem gleichen Docker Bild basieren. Dies bedeutet, dass in jedem Andockcontainer dieselbe Anwendung ausgeführt wird. Es kann der Fall sein, dass die Anwendung groß genug ist und viel Festplattenspeicher benötigt.Docker Container und Speicherverbrauch

Wie geht es dem Hafenarbeiter?

Umfassen alle Docker-Container den statischen Teil, der im Docker-Image definiert ist?

Wenn nicht, macht es Sinn, die Anwendung in ein Verzeichnis auf dem Computer zu kopieren, auf dem Docker-Container ausgeführt werden, und dieses Anwendungsverzeichnis für jeden Andock-Container bereitzustellen?

Antwort

74

Docker teilt Ressourcen auf Kernel-Ebene. Dies bedeutet, dass Anwendungslogik niemals repliziert wird, wenn sie ausgeführt wird. Wenn Sie den Notizblock 1000 Mal starten, wird er nur einmal auf Ihrer Festplatte gespeichert, dasselbe gilt für Andock-Instanzen.

Wenn Sie 100 Instanzen des gleichen Docker-Images ausführen, behalten Sie nur den Zustand derselben Software in Ihrem RAM in 100 verschiedenen getrennten Zeitachsen. Der/die Host-Prozessor (en) verschieben den speicherinternen Zustand jeder dieser Container-Instanzen gegen die Software, die ihn steuert, so dass Sie den zum Ausführen der Anwendung erforderlichen RAM-Speicher 100 Mal verbrauchen. Es hat keinen Sinn, den exakt gleichen Byte-Code für die Software 100-mal physikalisch zu speichern, da dieser Teil der Anwendung immer statisch ist und sich niemals ändern wird. (Es sei denn, Sie schreiben eine verrückte, sich selbst verändernde Software, oder Sie wählen das Image Ihres Containers neu und stellen es wieder her)

Aus diesem Grund ist in Containern keine Persistenz möglich, und Docker unterscheidet sich von normalen VMs Verwenden Sie virtuelle Festplatten. Dies gilt jedoch nur für die Persistenz innerhalb des Containers. Die Dateien, die von der Docker-Software auf der Festplatte geändert werden, werden mit den Andock-Volumes in Containern "eingehängt" und sind somit nicht wirklich Teil der Docker-Umgebungen, sondern nur in diese eingehängt. (Weitere Informationen hierzu finden Sie unter:)

Eine weitere Frage, die Sie vielleicht stellen sollten, wenn Sie darüber nachdenken, ist, wie Docker Änderungen speichert, die während der Laufzeit auf dem Datenträger vorgenommen werden. Was wirklich süß ist, ist, wie es Docker tatsächlich gelingt, das zum Laufen zu bringen. Der ursprüngliche Zustand der Festplatte des Containers entspricht dem, was ihm vom Image zugewiesen wird. Es kann NICHT auf dieses Bild schreiben. Anstatt in das Bild zu schreiben, wird ein Unterschied gemacht, was im internen Zustand des Containers im Vergleich zum Docker-Bild geändert wird. Docker verwendet eine Technologie namens "Union Filesystem", die eine Diff-Ebene über dem Anfangszustand des Docker-Bilds erstellt.

Dieser "diff" (in der folgenden Abbildung als beschreibbarer Container bezeichnet) wird im Speicher gespeichert und verschwindet, wenn Sie den Container löschen. (Es sei denn, Sie den Befehl „Docker begehen“, aber: Ich nicht empfehlen Der Zustand Ihres neuen Docker Bild nicht in einem dockerfile dargestellt und nicht leicht von einem Wiederaufbau regeneriert werden kann.)

Union Filesystem