‫Okay, in diesem Vortrag werden wir über Bildebenen sprechen.
‫Dies ist also ein grundlegendes Konzept für die Funktionsweise von Docker. Es wird das so genannte
‫Unionsdateisystem verwendet, um eine Reihe von Dateisystemänderungen als tatsächliches Dateisystem darzustellen.
‫Wir werden in die Geschichte eintauchen und Befehle untersuchen und sehen, wie wir sie verwenden können,
‫um zu verstehen, woraus ein Bild tatsächlich besteht. Wir werden ein wenig über das Copy-on-Write-Konzept
‫lernen, wie ein Container als zusätzliche Ebene über einem Bild ausgeführt wird.
‫Was meine ich mit Bildebenen?
‫Es ist für Sie eigentlich völlig transparent, wenn Sie Docker verwenden, aber wenn Sie anfangen, sich mit bestimmten
‫Befehlen wie dem Befehl history, dem Befehl inspect und dem Befehl commit zu befassen, bekommen
‫Sie das Gefühl, dass ein Bild kein großer Datenblock ist kommt und geht in einem großen stück.
‫Richtig?
‫Wenn Sie bemerken, dass wir Docker-Pulls tatsächlich durchgeführt haben, werden manchmal Wörter angezeigt, die darauf
‫hinweisen, dass Sie bereits etwas haben, beispielsweise einen Teil davon zwischengespeichert haben, und dass alles
‫auf die Tatsache zurückzuführen ist, dass Bilder mithilfe von Design erstellt wurden das Dateisystemkonzept der Union, bei dem Ebenen über
‫die Änderungen erstellt werden.
‫Wenn wir uns nur schnell ansehen könnten, was wir in Docker haben ... in Docker-Bildern tatsächlich ...
‫Vor einiger Zeit haben wir mit Nginx an den Tags rumgespielt. Richtig? Wir erinnern uns, dass
‫die Nginx-Image-ID identisch ist und wir unterschiedliche Tags für denselben Image-Namen hatten.
‫Machen wir also einen kurzen Docker-Verlauf auf Nginx.
‫Was schaue ich hier an?
‫Dies ist keine Liste von Dingen, die tatsächlich im Container passiert sind, da es sich um ein Bild handelt.
‫Dies ist eigentlich eine Geschichte der Bildebenen.
‫Jedes Bild beginnt von Anfang an mit einer leeren Ebene, die als Kratzer bezeichnet wird.
‫Dann ist jede Reihe von Änderungen, die danach im Dateisystem im Image vorgenommen werden, eine weitere Ebene.
‫Möglicherweise haben Sie eine Ebene, möglicherweise Dutzende von Ebenen, und bei einigen Ebenen ändert sich die
‫Dateigröße möglicherweise nicht.
‫Sie werden hier feststellen, dass wir hier tatsächlich eine Änderung haben, die lediglich eine Metadatenänderung darüber war, welchen
‫Befehl wir tatsächlich ausführen werden. Wir werden das gleich behandeln, wenn wir das
‫Dockerfile durchgehen.
‫Aber im Moment können Sie tatsächlich sehen, dass dieser eine riesige Menge von Dateien hinzugefügt hat, die 123 MB groß waren.
‫Dann haben wir hier und hier eine Änderung vorgenommen und ich weiß zufällig
‫aufgrund von Dockerfiles, dass dies wirklich nur Dockerfile-Metadateninformationen sind.
‫Während Sie aufsteigen, haben wir einige weitere Datenänderungen.
‫Sie werden sehen, dass dies in einem anderen Bild tatsächlich ganz anders ist.
‫Wenn wir also in die Docker-Geschichte von MySQL gehen, hat diese eine völlig andere Menge von Bildebenen.
‫Lassen Sie mich dies ein wenig für Sie zeichnen und vielleicht hilft dies.
‫Wenn wir ein Bild starten, wenn wir
‫ein neues Bild erstellen, beginnen wir mit einer Ebene. Jede Schicht erhält eine eigene SHA, mit deren Hilfe das System erkennt, ob diese
‫Schicht tatsächlich mit einer anderen Schicht identisch ist.
‫Sagen wir einfach, zu Beginn eines von Ihnen könnte ganz unten Ubuntu stehen.
‫Das ist die erste Ebene in Ihrem Bild.
‫Anschließend erstellen Sie eine Docker-Datei, in der weitere Dateien hinzugefügt werden. Dies ist eine weitere Ebene
‫über dem Bild. Vielleicht benutzen wir Apt dafür.
‫Anschließend nehmen Sie in Ihrer Docker-Datei eine Umgebungsvariablenänderung vor. Das zusammen ist dein Image.
‫OK?
‫Möglicherweise haben Sie ein anderes Image, das von debian ausgeht: jessie und auf diesem Image können Sie
‫auch Apt verwenden, um einige
‫Dinge zu installieren, sagen wir MySQL. Möglicherweise kopieren Sie einige Dateien und öffnen einen Port.
‫Jede dieser Änderungen, die Sie normalerweise in der Docker-Datei vornehmen, können Sie aber auch mit
‫dem Commit-Docker-Befehl vornehmen, den wir in einer Minute auschecken.
‫Dies ist auch ein anderes Bild und diese sind alle zusammen gebündelt.
‫Was passiert, wenn ich ein anderes Image habe, das auch dieselbe Version von jessie verwendet?
‫Nun, dieses Bild kann seine eigenen Änderungen auf der gleichen
‫Ebene haben, die ich in meinem Cache habe. Hier spart uns das grundlegende Konzept des Cache
‫von Bildebenen viel Zeit und Raum. Da wir keine Layer herunterladen müssen, die wir bereits
‫haben, wird für jeden Layer ein eindeutiger SHA verwendet, so dass garantiert wird, dass er den
‫genauen Layer enthält, den er benötigt. Es kann sie zwischen Docker Hub und unserem lokalen Cache zuordnen. Wenn wir Änderungen
‫an unseren Bildern vornehmen, werden mehr Ebenen erstellt.
‫Wenn wir beschließen, dass dasselbe Bild das Basisbild für mehrere Ebenen sein soll, wird immer nur
‫eine Kopie jeder Ebene gespeichert.
‫In diesem System besteht einer der größten Vorteile darin, dass wir niemals dieselben Bilddaten mehr als
‫einmal in unserem Dateisystem speichern.
‫Dies bedeutet auch, dass wir beim Hoch- und Herunterladen nicht dieselben
‫Ebenen hochladen
‫und herunterladen müssen, die wir bereits auf der anderen Seite haben. Wenn Sie ein eigenes Image haben sollten
‫und es benutzerdefiniert war, dass Sie es selbst erstellt haben, und dann beispielsweise einen Apache-Server als weitere Ebene in
‫Ihrer Docker-Datei hinzugefügt haben, sollten Sie anschließend Port 80 öffnen. Ganz am Ende sagten Sie tatsächlich, es soll in den Quellcode kopiert werden, aber Sie hatten
‫tatsächlich zwei verschiedene Dockerdateien für zwei verschiedene Websites, und jede Zeile in den Dockerdateien war die
‫gleiche, mit Ausnahme des letzten kleinen Teils, in dem Sie die Website kopiert haben A in das Bild und dann Website
‫B, würden Sie mit zwei Bildern enden. Wir werden das gleich zeigen. Dies macht ein Bild aus
‫und dies macht ein Bild aus, aber die einzigen Dateien, die tatsächlich gespeichert werden, sind diese,
‫diese, diese Schicht und dann diese kleine Schicht und dann diese kleine Schicht.
‫Wir speichern also nie den gesamten Stapel von Bildebenen mehr als einmal, wenn es sich wirklich um dieselben Ebenen handelt.
‫Wie funktioniert das mit Containern?
‫Wenn Sie Ihr Image haben, nehmen wir an, wir haben unser Apache-Image, und wir beschließen,
‫einen Container davon auszuführen. Docker erstellt lediglich eine neue Lese- / Schreibebene für
‫diesen Container über dem Apache-Image. Wenn wir das Dateisystem und diese Dinge
‫durchsehen, sehen alle Container und Bilder wie ein reguläres Dateisystem aus, aber unter dem Speichertreiber,
‫den Docker verwendet, werden all diese Änderungen wie ein Stapel
‫Pfannkuchen überlagert übereinander.
‫Wenn also zwei Container gleichzeitig mit demselben Apache-Image ausgeführt würden, würden Container 1 und Container 2 nur in Bezug
‫auf den Dateibereich anzeigen. Dies wäre nur der Unterschied zwischen dem, was auf
‫dem aktiven Container ausgeführt wird, und dem, was passiert ist geschieht im Basis-Image, das schreibgeschützt ist.
‫Wenn Sie Container ausführen und Dateien ändern, die über das Image
‫eingegangen sind, nehmen wir an, ich habe Container 3 gestartet und tatsächlich eine Datei in diesem Image im aktiven Container
‫geändert ...
‫Dies wird als Copy-on-Write bezeichnet.
‫Das Dateisystem entfernt diese Datei aus dem Image und kopiert sie in dieses Unterscheidungselement.
‫hier oben... und speichern Sie eine Kopie dieser Datei in der Containerebene.
‫Der Container besteht also nur noch aus dem laufenden Prozess
‫und den Dateien, die sich vom Apache-Image unterscheiden.
‫Wenn wir zu unserer Bilderliste zurückkehren und uns diese Befehle noch einmal ansehen, sehen wir uns die
‫unterste an und sehen, wie sich die Daten unterscheiden? Wir können tatsächlich feststellen, dass dieses Image in Docker Hub geändert
‫wurde und im Laufe der Zeit aktualisiert wurde, dass diese Änderungen seit vier
‫Wochen nicht mehr auf der untersten Ebene geändert wurden und dass die letzten Änderungen in den letzten zwei Wochen
‫stattgefunden haben.
‫Übrigens, mach dir keine Sorgen wegen des fehlenden Teils.
‫Das ist eigentlich nur eine falsche Bezeichnung in der Docker-Oberfläche.
‫Das bedeutet nicht, dass etwas nicht stimmt oder falsch konfiguriert ist. Was es bedeutet ist, dass dieses MySQL-Bild
‫hier wirklich diese Bild-ID ist.
‫Die anderen Ebenen im Bild sind eigentlich keine Bilder.
‫Sie sind nur Ebenen in diesem Bild,
‫und daher würden sie dort nicht unbedingt ihre eigene Bild-ID erhalten.
‫Persönlich finde ich es etwas irreführend, das zu sagen, aber so haben sie es geschrieben.
‫Nachdem wir nun einen Einblick in den Befehl history erhalten haben,
‫der uns zeigt, woraus ein Bild bestehen könnte, verwenden wir den Befehl inspect.
‫Dies gibt uns alle Details über das Bild.
‫Dies sind im Grunde die Metadaten. Erinnern Sie sich, als wir darüber gesprochen
‫haben, dass ein Bild aus zwei Teilen besteht, den Binärdateien
‫und ihren Abhängigkeiten und dann den Metadaten zu diesem Bild? Inspect gibt Ihnen die Metadaten zurück.
‫Neben den grundlegenden Informationen, wie der Image-ID und ihren Tags, erhalten Sie alle möglichen Details dazu, wie dieses
‫Image ausgeführt werden soll.
‫Tatsächlich besteht die Möglichkeit, diese beiden Ports im Image freizulegen, damit Sie wissen, wann Sie es starten
‫möchten und welche Ports Sie in Ihrem Docker-Host öffnen müssen, wenn Verbindungen akzeptiert werden sollen.
‫Sie können tatsächlich sehen, dass Umgebungsvariablen übergeben wurden, einschließlich der Version von
‫Nginx, die ausgeführt wird, und des Pfads. Sie können den Befehl sehen, der ausgeführt wird, wenn Sie das
‫Image standardmäßig starten.
‫Auch hier können viele dieser Dinge geändert werden, wie wir es zuvor mit dem Befehl docker container
‫run getan haben.
‫Aber diese zeigen uns alle Standardeinstellungen und einige andere interessante Informationen wie den Autor
‫und hier unten, dass es sich um eine AMD64-Architektur handelt, auf der heutzutage so ziemlich alle normalen
‫PCs und Macs laufen.
‫Wir haben nicht wirklich zu viele 32-Bit-Computer im Einsatz, daher handelt es sich hier nur
‫um eine 64-Bit-Intel-Standardarchitektur, die für den Betrieb unter Linux entwickelt wurde.
‫Ok, eine kurze Bewertung.
‫Wir haben also viel über Bilder gelernt und wie sie aufgebaut sind, und wir
‫stellen fest, dass sie eigentlich nicht so komplex sind. In Wirklichkeit handelt es sich nur um eine Reihe von Änderungen im Dateisystem und Metadaten zu diesen Änderungen.
‫Sie haben erfahren, dass jede Ebene eine eigene eindeutige Identität als SHA hat.
‫Sie werden auf jedem System nur einmal gespeichert, sodass auf jedem Docker-Daemon jede Ebene nur einmal im
‫Dateisystem dargestellt wird.
‫Dadurch sparen wir viel Platz und übertragen Zeit beim Hin- und Herschicken von Bildern
‫zwischen Registern wie Docker Hub. Wenn Sie einen Container starten, handelt
‫es sich tatsächlich nur um eine einzelne Ebene mit Änderungen über einem vorhandenen Bild.
‫Es ist also normalerweise sehr klein. Wir haben etwas über die Geschichte und die Befehle gelernt und erfahren, wie
‫sie uns beibringen können, was in einem Bild vor sich geht und wie es erstellt wurde.