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

Einführung in den Prozess zum Erstellen eigener FTP- und SFTP-Server

FTP und SFTP werden häufig als Dateiübertragungsp...

Details zum TypeScript-Mapping-Typ

Inhaltsverzeichnis 1. Zugeordnete Typen 2. Mappin...

5 Punkte, auf die Sie beim Erstellen einer Webseite achten sollten

1. Farbabstimmungsproblem <br />Eine Webseit...

CSS-Ansichtsfenstereinheiten für schnelles Layout

CSS-Viewport-Einheiten gibt es schon seit einigen...

Erweiterte Erklärung der Javascript-Funktionen

Inhaltsverzeichnis Funktionsdefinitionsmethode Fu...

Weitere Möglichkeiten zur Verwendung von spitzen Klammern in Bash

Vorwort In diesem Artikel werden wir weitere Verw...

Konfigurieren von MySQL und Squel Pro auf dem Mac

Als Reaktion auf die Popularität von nodejs haben...

Fallstudie: Ajax responseText analysiert JSON-Daten

Lösen Sie das Problem, dass der vom Server nach d...

Der Prozess der Installation und Konfiguration von Nginx in Win10

1. Einleitung Nginx ist ein kostenloser, quelloff...

Webdesign: Skriptmaterialien rekonstruieren das Benutzererlebnis

<br />Originaltext: http://blog.rexsong.com/...

Detaillierte Erklärung der allgemeinen For-Schleife in JavaScript-Anweisungen

Es gibt viele Schleifenanweisungen in JavaScript,...

Detaillierter Installationsprozess und Prinzip des Vue-Routers

Inhaltsverzeichnis 1. Implementierungsprinzip des...