Docker-Image-Optimierung (von 1,16 GB auf 22,4 MB)

Docker-Image-Optimierung (von 1,16 GB auf 22,4 MB)

Docker ist eine Plattform für Softwareentwickler und Systemadministratoren zum Erstellen, Ausführen und Teilen von Anwendungen mithilfe von Containern. Ein Container ist ein Prozess, der in einer isolierten Umgebung auf seinem eigenen Dateisystem ausgeführt wird, das mit einem Docker-Image erstellt wird. Ein Image enthält alles, was zum Ausführen Ihrer Anwendung erforderlich ist (kompilierter Code, Abhängigkeiten, Bibliotheken usw.). Bilder werden mithilfe von Dockerfile-Dateien definiert.

Die Begriffe Dockerisierung oder Containerisierung werden häufig verwendet, um den Prozess der Erstellung eines Docker-Containers zu definieren.

Container sind beliebt, weil sie folgende Vorteile bieten:

  • Flexibilität: Selbst die komplexesten Anwendungen können containerisiert werden.
  • Leichtgewichtig: Container teilen sich den Host-Kernel und sind daher weitaus effizienter als virtuelle Maschinen.
  • Portabilität: Kann lokal kompiliert und überall ausgeführt werden.
  • Lose Kopplung: Container sind in sich gekapselt und das Ersetzen oder Aktualisieren eines Containers unterbricht keine anderen Container.
  • Sicherheit: Container schränken Prozesse strikt ein und isolieren sie, ohne dass eine Konfiguration durch den Benutzer erforderlich ist.

In diesem Artikel werde ich mich darauf konzentrieren, wie Docker-Images optimiert werden können, um sie leichter zu machen.

Beginnen wir mit einem Beispiel, bei dem wir eine React-Anwendung erstellen und in einen Container packen. Nachdem wir den npx-Befehl ausgeführt und die Docker-Datei erstellt haben, erhalten wir die in Abbildung 1 dargestellte Dateistruktur.

npx Erstellen-Reagieren-App App --Vorlage Typescript 

Bild

Abbildung 1: Dateistruktur

Wenn wir ein einfaches Dockerfile erstellen (siehe unten), erhalten wir ein 1,16 GB großes Image:

VON Knoten:10
WORKDIR /appCOPY app /appRUN npm install -g webserver.localRUN npm install && npm run build
EXPOSE 3000CMD webserver.local -d ./build 

Bild

Abbildung 2: Die ursprüngliche Größe des Bildes beträgt 1,16 GB

Der erste Schritt der Optimierung: Verwenden eines leichten Basis-Images

Im Docker Hub (einem öffentlichen Docker-Repository) stehen mehrere Images mit jeweils unterschiedlichen Eigenschaften und Größen zum Download bereit.

Normalerweise sind Images, die auf Alpine oder BusyBox basieren, im Vergleich zu Images, die auf anderen Linux-Distributionen (wie Ubuntu) basieren, sehr klein. Dies liegt daran, dass Alpine-Images und ähnliche Images so optimiert sind, dass sie nur die unbedingt erforderlichen Pakete enthalten. Im Bild unten sehen Sie einen Größenvergleich zwischen Ubuntu, Alpine, Node und dem auf Alpine basierenden Node-Image.

Bild

Abbildung 3: Unterschiedliche Größen der Basisbilder

Durch Ändern der Docker-Datei und Verwenden von Alpine als Basis-Image ist unser Image letztendlich 330 MB groß:

VON Knoten:10-alpine
WORKDIR /appCOPY app /appRUN npm install -g webserver.localRUN npm install && npm run build
EXPOSE 3000CMD webserver.local -d ./build 

Bild

Abbildung 4: Nach dem ersten Optimierungsschritt beträgt die Bildgröße 330 MB

Zweiter Optimierungsschritt: mehrstufiger Aufbau

Bei mehrstufigen Builds können wir mehrere Basisimages in unserem Dockerfile verwenden und kompilierte Produkte, Konfigurationsdateien usw. von einer Stufe in eine andere kopieren, sodass wir verwerfen können, was wir nicht benötigen.

In diesem Fall benötigen wir den kompilierten Code, um die React-Anwendung bereitzustellen. Wir benötigen weder die Quelldateien, das Verzeichnis node_modules, die Datei package.json usw. Folgen Sie dem öffentlichen Konto Nifengqibi, antworten Sie als PDF und laden Sie alle Lernmaterialien herunter, die Sie benötigen.

Durch Ändern des Docker-Files mit dem folgenden Inhalt erhalten wir schließlich eine Bildgröße von 91,5 MB. Denken Sie daran, dass das Image aus der ersten Phase (Zeilen 1–4) nicht automatisch gelöscht wird. Docker behält es im Cache, wodurch der Image-Aufbau beschleunigt werden kann, wenn wir dieselbe Phase in einem anderen Image-Aufbauprozess ausführen. Sie müssen das Bild der ersten Stufe also manuell löschen.​​​​​​​​

VON Knoten:10-alpine AS buildWORKDIR /appCOPY app /appRUN npm install && npm run build
VON Knoten:10-alpineWORKDIR /appRUN npm install -g webserver.localCOPY --from=build /app/build ./buildEXPOSE 3000CMD webserver.local -d ./build 

Bild

Abbildung 5: Die Bildgröße nach dem zweiten Optimierungsschritt beträgt 91,5 MB

Jetzt haben wir ein Dockerfile mit zwei Phasen: In der ersten Phase kompilieren wir das Projekt und in der zweiten Phase stellen wir die Anwendung auf dem Webserver bereit. Allerdings sind Node-Container nicht die beste Wahl zum Bereitstellen von Webseiten (HTML-, CSS- und JavaScript-Dateien, Bilder usw.). Die beste Option ist die Verwendung eines Dienstes wie Nginx oder Apache. In diesem Beispiel verwende ich Nginx.

Durch die folgende Änderung des Dockerfiles wird unser Image 22,4 MB groß. Wenn wir diesen Container ausführen, können wir sehen, dass die Webseite ohne Probleme funktioniert (Abbildung 7).

VON Knoten:10-alpine AS buildWORKDIR /appCOPY app /appRUN npm install && npm run build

VON nginx:stable-alpineCOPY --from=build /app/build /usr/share/nginx/htmlEXPOSE 80CMD ["nginx", "-g", "Daemon aus;"] 

Bild

Abbildung 6: Die Bildgröße nach dem dritten Optimierungsschritt beträgt 22,4 MB

Bild

Abbildung 7: Endgültiges Container-Ausführungsergebnis

Dies ist das Ende dieses Artikels zur Docker-Image-Optimierung (von 1,16 GB auf 22,4 MB). Weitere relevante Inhalte zur Docker-Image-Optimierung finden Sie in den vorherigen Artikeln von 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • Komprimierungs- und Optimierungsvorgänge für Docker-Images
  • Gängige Methoden zur Optimierung der Docker-Imagegröße

<<:  Warum wird die MySQL-Paging-Funktion bei Verwendung von Limits immer langsamer?

>>:  CSS+HTML zur Implementierung des Platzhalter-Animationseffekts beim Laden des Skeleton-Bildschirms (mit Animation)

Artikel empfehlen

Einige Fehler, die JavaScript-Anfänger häufig machen

Inhaltsverzeichnis Vorwort Verwechslung von „unde...

Zusammenfassung zweier Methoden zum Implementieren der Vue-Druckfunktion

Methode 1: Installieren Sie das Plugin über npm 1...

Unterschied und Prinzipanalyse des Nginx-Forward- und Reverse-Proxy

1. Der Unterschied zwischen Forward-Proxy und Rev...

Javascript um den Drag-Effekt der Login-Box zu erreichen

In diesem Artikel wird der spezifische Code von J...

Beispielanalyse für MySQL-Transaktionen, Isolationsebenen und Sperrenverwendung

Dieser Artikel beschreibt anhand von Beispielen M...

Reparaturlösung für inkonsistenten MySQL GTID-Master und -Slave

Inhaltsverzeichnis Lösung 1: Replikate neu erstel...

Eine kurze Analyse der Zählverfolgung einer Anfrage in nginx

Lassen Sie mich zunächst die Anwendungsmethode er...

So erstellen Sie einen Flammeneffekt mit CSS

Unten beginnt der Haupttext. 123WORDPRESS.COM Her...

Zusammenfassung der Verwendung von vue Watch und Computed

Inhaltsverzeichnis 01. Hörer beobachten (1) Funkt...

Der vollständige Implementierungsprozess von Sudoku mit JavaScript

Inhaltsverzeichnis Vorwort So lösen Sie Sudoku Fü...