kalafoto - stock.adobe.com
Sechs Tipps zur Verwaltung von Containerkomponenten
Container-Images sind einfach zu erstellen. Allerdings erfordert deren Optimierung und Verwaltung eine sorgfältige Prüfung und Planung. Sechs Tipps hierfür.
Jeder funktionierende Container besteht aus einer Kombination von diskreten Komponenten. Dazu gehört eine Basis-Image-Datei und eine oder mehrere Layer-Dateien, die auf das Basis-Image geladen werden. Dieser mehrschichtige Ansatz wird besonders häufig in Docker-Containern verwendet. Das Konzept ermöglicht es Containern, sowohl das Basis-Image als auch jede Layer-Datei gemeinsam zu nutzen und wiederzuverwenden.
Insgesamt ist das ein elegantes und effizientes System, da Entwickler damit komplexe Containerinstanzen mit gerade so vielen Komponenten konstruieren können, dass die gewünschte Containerfunktionalität gewährleistet ist.
Ein derartiges System erfordert jedoch ein akkurates Management der Containerkomponenten, einschließlich der Container-Images. Lassen Sie uns einige der Tools und Praktiken vorstellen, die dabei helfen können.
Eine Anwendung pro Container
Beschränken Sie die Anzahl der übergeordneten Prozesse, die innerhalb eines einzelnen Containers ausgeführt werden dürfen. Containertechnologie ist von ihrem Grundansatz her flüchtig: Der Container sollte nur so lange vorhanden sein, wie die darin enthaltene Anwendung. Wenn ein Container mehrere übergeordnete Prozesse beherbergt, aber nur einen von ihnen ausführt, verliert der Container leicht seine Effizienz. Stattdessen ist es besser, separate Container zu verwenden und jede Komponente einzeln auszuführen.
Benennen Sie Images sorgfältig
Softwareanwendungen werden im Allgemeinen als Container-Images mit einem Basis-Image und einer Reihe von zusätzlichen Software-Layer veröffentlicht. Die zusätzlichen Images erweitern und optimieren das Basis-Image. Es ist dabei wichtig, das Container-Image zu dokumentieren, indem man jeder Image-Datei einen entsprechenden Namen und einen Tag zuordnet.
Für die Benennung und Kennzeichnung von Container-Images gibt es keine einheitlichen Regeln oder Anforderungen. Sinnvoll ist es, Richtlinien zu übernehmen und zu pflegen, die Benutzer verstehen und befolgen können. Im Allgemeinen verwendet der semantische Versionierungsansatz einen dreigliedrigen x.y.z-Ansatz, um die major.minor.patch-Level eines Image zu bezeichnen. Zum Beispiel bezeichnet das Tag 10.0.0 die Hauptversion 10. Das Tag 10.2.5 hingegen bezeichnet den fünften Patch für jedes Update für Version 10.
Nutzen Sie den Build Cache optimal
Container-Image-Dateien werden in einer Layer-Folge unter Verwendung einer Anweisungs- oder Template-Datei erstellt, wie zum Beispiel einer Docker-Datei. Diese Layer - und ihre Reihenfolge - werden typischerweise von der Container-Plattform zwischengespeichert. Um ein Beispiel zu nennen: Docker bietet einen Build Cache, der die Wiederverwendung von Layer ermöglicht. Dieser Build Cache kann nachfolgende Container-Builds erheblich beschleunigen. Allerdings können Sie den Cache nur verwenden, wenn alle vorherigen Layer vorhanden sind. Die effektive Nutzung des Build Cache erfordert also ein wenig Build-Planung.
Betrachten Sie zum Beispiel eine Build-Datei mit einem Schritt A, einem Schritt B und einem Schritt C. Wenn eine Änderung an Schritt C vorgenommen wird, kann die Build-Datei die Schritte A und B aus dem Cache wiederverwenden. Das spart Zeit und beschleunigt den Image-Build-Prozess. Wenn allerdings Schritt A geändert wird, kann die Build-Datei die anderen Schritte im Cache nicht mehr verwenden.
Stellen Sie außerdem sicher, dass Sie alle anderen für den Build benötigten Inhalte aktualisieren, wie zum Beispiel verwandte Repositorys. Verwenden Sie dann diese zur Build-Zeit, auch wenn der Build Cache wieder genutzt wird. Andernfalls könnte es zu einem falschen Build kommen, der ältere Inhalte verwendet.
Berücksichtigen Sie Container-Shutdowns
Linux verwendet mehrere Signale, zum Beispiel sigterm, sigkill und sigint, um Prozesse zu beenden. Jeder Container hat aber seine eigenen Prozessidentifikatoren. Containerplattformen wie Docker und Kubernetes verwenden die gleichen Signale, um mit containerisierten Prozessen zu kommunizieren. Linux behandelt Signale für Container jedoch anders als andere Prozesse, und Signale funktionieren standardmäßig nicht. Stattdessen benötigen diese Signale sigkill, um Containerprozesse zu beenden, was zu Fehlern führt, Schreibvorgänge unterbricht, Warnungen auslöst und im Grunde jede Art von geordneter Abschaltung des Container-Prozesses verhindert.
Der beste Weg, dieses Problem zu lösen, ist der Einsatz eines speziellen init-Systems wie Linux Tini, das sich gut für Container eignet. Ein Tool wie Tini registriert korrekte Signal-Handler, so dass Linux-Signale für containerisierte Anwendungen funktionieren und alle verwaisten Prozesse herunterfahren, um Speicher wiederherzustellen.
Optimieren Sie Container-Image-Dateien
In der Regel geht man am besten so vor, dass ein möglichst kleines Container-Image erstellt wird. Es passiert leicht, ein Image versehentlich mit nicht optimierten Basis-Images, unerwarteten Abhängigkeiten und unnötigen Containerkomponenten aufzublähen. Kleinere Image-Dateien lassen sich schneller hoch- und herunterladen, erfordern weniger Rechenressourcen und verursachen weniger Schwachstellen.
Beispielsweise können Sie die Größe eines Basis-Betriebssystems erheblich beeinflussen, indem Sie eine kleinere oder reduzierte Linux-Distribution verwenden, die zahlreiche wahrscheinlich nicht benötigte Tools und Pakete ablegen kann. Es ist auch wichtig, das Image während des Build-Prozesses zu entrümpeln, indem unnötige Container-Komponenten oder weitere Tools, die als zusätzliche Layer fungieren, entfernt werden.
Schließlich ist die Verwendung von mehrstufigen Builds zu berücksichtigen, wenn die Containerplattform diese unterstützt. Docker beispielsweise führte mit der Version 17.05 mehrstufige Builds ein. Diese Funktion ermöglicht es Entwicklern, eine Image-Datei zu erstellen und diese Image-Datei dann als Teil eines anderen Build zu verwenden - und zwar unter Verwendung derselben Docker-Datei.
Planen Sie im Voraus
Container-Images sind einfach zu erstellen. Aber eine effektive Optimierung und Verwaltung von Container-Images erfordert eine sorgfältige Prüfung und Planung. Die Beachtung von Faktoren wie Image-Größe, korrekte Namenskonventionen, Sicherheit und Optimierungen können zu einer sichereren und effizienteren Container-Nutzung in Unternehmen führen.