„ Containerisierung “, sagte mein Manager unmissverständlich, als ich ihn nach dem größten Ding fragte, das die Softwareentwicklungsbranche revolutioniert hat. Er argumentierte, dass ohne Containerisierung die schnelle Skalierung und globale Bereitstellung der heutigen Software eine weitaus größere Herausforderung gewesen wäre. Es ist bemerkenswert, dass fast die gesamte heute verwendete Software die Containerisierung in verschiedenen Funktionen nutzt, was ihre unverzichtbare Rolle als Antrieb für das moderne Software-Ökosystem unterstreicht!
Für diejenigen unter Ihnen, die es nicht wissen, hier ist eine Definition von der AWS-Website ~
*“Containerisation is a software deployment process that bundles an application's code with all the files and libraries it needs to run on any infrastructure. Traditionally, to run any application on your computer, you had to install the version that matched your machine's operating system.”*
Bilder dienen als Bausteine für Container, ähnlich wie Blaupausen, die ihre Entstehung leiten. Daher beschleunigt die Pflege schlanker und optimierter Container-Images den Bereitstellungsprozess und erleichtert die Verteilung dieser Images. Durch die Optimierung Ihrer Docker-Images können Sie nicht nur den gesamten Entwicklungszyklus beschleunigen, sondern auch die vorhandenen Sicherheitsmaßnahmen stärken und so eine robustere und effizientere Softwareumgebung gewährleisten.
In diesem Artikel werden wir verschiedene Methoden zum Erstellen effizienter Docker-Images untersuchen, um letztendlich die Effizienz Ihrer Anwendung zu steigern.
Es ist ein häufiger Fehler, Container wie virtuelle Maschinen (VMs) zu behandeln und mehr als eine Anwendung in einen einzigen Container zu packen. Diese Vorgehensweise erhöht zwar die Größe Ihres Containers, hat aber auch andere Nachteile.
Von einem Container wird erwartet, dass die Lebensdauer eng mit der von ihm ausgeführten Anwendung zusammenhängt. Der Container sollte starten, wenn die App gestartet wird, und enden, wenn die App beendet ist. Container-Orchestrierungslösungen wie Docker und Kubernetes stützen sich maßgeblich auf diese Eigenschaft von Containern. Wenn in einem Container viele Apps ausgeführt werden, können die Orchestrierungstools Ihre Anwendung nicht identifizieren und neu starten!
Bilder bestehen aus Ebenen und jede Anweisung in Ihrer Docker-Datei fügt eine neue Ebene hinzu. Containerisierungstechnologien wie Docker werden versuchen, Schichten aus früheren Builds, wo immer möglich, wiederzuverwenden, um die Build-Zeit zu verkürzen. Der Cache für einen Layer darf nur verwendet werden, wenn sich keiner der darunter liegenden Layer seit früheren Builds geändert hat.
Um die Geschwindigkeit der Image-Erstellung zu erhöhen, ist es hilfreich, Anweisungen, die sich häufig ändern können, unten in Ihrer Docker-Datei zu positionieren. Dieser Ansatz ermöglicht es Docker, sein Caching-System effektiver zu nutzen. Da sich beispielsweise der Quellcode oft häufig ändert, empfiehlt es sich, ihn gegen Ende des Prozesses in das Image zu kopieren.
Ihre Bilder werden dadurch zwar nicht heller, der Erstellungsprozess läuft jedoch schneller!
Container-Images enthalten häufig unnötige Tools, was zu einer Aufblähung der Images und potenziellen Sicherheitslücken führt. Tools wie netcat
können beispielsweise von Hackern ausgenutzt werden, um böswillige Aktivitäten innerhalb Ihres Containers durchzuführen, wenn sie unbefugten Zugriff erhalten.
Die strikte Einhaltung der Tools und Bibliotheken, die mit Ihrem Container-Image geliefert werden, kann erheblich zur Reduzierung von Sicherheitsbedrohungen beitragen und würde auch zu schlankeren Images führen. Kleinere Bilder werden schneller heruntergeladen, was bedeutet, dass der Container schneller startet.
Das Bild, auf das wir in der FROM-Anweisung verweisen, wird als Basisbild bezeichnet. Das Basisbild bestimmt maßgeblich die Größe des endgültig erstellten Bildes. Wir sollten versuchen, das kleinstmögliche Basisbild zu verwenden, um die endgültige Größe unseres Bildes zu reduzieren.
Versuchen Sie nach Möglichkeit Alpenbilder zu verwenden, da diese kleiner sind und häufig genügend Tools zur Unterstützung der Entwicklungsaktivitäten enthalten.
Selbst wenn ein kleines Bild nicht alle benötigten Werkzeuge enthält, kann die Verwendung dieses Bilds dennoch die bessere Option sein. Durch die Installation von Paketen, die Sie benötigen, über dem leichteren Basis-Image können Sie möglicherweise immer noch Einsparungen gegenüber der Verwendung des schwereren Images erzielen.
Beim Kopieren des Quellcodes werden möglicherweise auch viele unerwünschte Dateien und Ordner kopiert. Dadurch vergrößert sich Ihr Bild und führt letztendlich zu einer Aufblähung. Versuchen Sie, die Menge der kopierten Dateien zu minimieren und auf ein Minimum zu beschränken.
Die Bedeutung der Optimierung von Container-Images und der Etablierung von Best Practices wird in unserer Branche oft übersehen. Die erheblichen Vorteile, die sich aus der Einhaltung dieser Praktiken ergeben, können jedoch nicht hoch genug eingeschätzt werden. Als Entwickler ist es wichtig, der Erstellung schlanker und schneller Container-Images konsequent Priorität einzuräumen.
Damit sind wir am Ende dieses Artikels angelangt. Ich hoffe, es hat Ihnen Spaß gemacht, es zu lesen!