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

Was tun, wenn Sie das ursprüngliche Passwort für MySQL auf dem MAC vergessen?

Die Lösung zum Vergessen des ursprünglichen MySQL...

Beispielcode zur Realisierung eines Buchseitenumblättereffekts mit CSS3

Wichtige Erkenntnisse: 1. Beherrschung der CSS3-3...

Ein Artikel, der Ihnen ein tiefes Verständnis von Mysql-Triggern vermittelt

Inhaltsverzeichnis 1. Wenn beim Einfügen oder Änd...

Tägliche Studiennotizen im HTML-Designmuster

Studiennotizen zu HTML-Entwurfsmustern Diese Woch...

Einführung und Verwendung des JS-Beobachtermodus

Inhaltsverzeichnis I. Definition 2. Anwendungssze...

So aktualisieren Sie Ubuntu 20.04 LTS unter Windows 10

23. April 2020: Heute können Sie mit Ubuntu 20.04...

Verstehen Sie das CSS3-Rasterlayout in 10 Minuten

Grundlegende Einführung Im vorherigen Artikel hab...

CSS Transition erweitert und reduziert Elemente durch Ändern der Höhe

Ein allgemeines Entwicklungsbedürfnis besteht dar...

Der Unterschied und die Verwendung von json.stringify() und json.parse()

1. Unterschiede zwischen JSON.stringify() und JSO...

Beispiel für eine CSS3-Tab-Animation mit dynamischem Hintergrundwechseleffekt

CSS 3-Animationsbeispiel - Dynamischer Effekt des...