Optimieren Sie die von AWS App2Container generierten Docker-Images - AWS Prescriptive Guidance

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Optimieren Sie die von AWS App2Container generierten Docker-Images

Erstellt von Varun Sharma (AWS)

Umgebung: PoC oder Pilotprojekt

Technologien: Container und Mikroservices; Modernisierung; DevOps

AWS-Dienste: Amazon ECS

Übersicht

AWS App2Container ist ein Befehlszeilentool, das dabei hilft, bestehende Anwendungen, die lokal oder auf virtuellen Maschinen ausgeführt werden, in Container umzuwandeln, ohne dass Codeänderungen erforderlich sind.

Basierend auf dem Anwendungstyp verfolgt App2Container einen konservativen Ansatz zur Identifizierung von Abhängigkeiten. Im Prozessmodus sind alle Dateien auf dem Anwendungsserver im Container-Image enthalten. In solchen Fällen kann ein ziemlich großes Bild generiert werden.

Dieses Muster bietet einen Ansatz zur Optimierung der von App2Container generierten Container-Images. Es gilt für alle Java-Anwendungen, die von App2Container im Prozessmodus entdeckt wurden. Der im Muster definierte Workflow ist für die Ausführung auf dem Anwendungsserver konzipiert.

Voraussetzungen und Einschränkungen

Voraussetzungen

Architektur

Quelltechnologie-Stack

  • Eine Java-Anwendung, die auf einem Linux-Server läuft

Zieltechnologie-Stack

  • Ein von App2Container generiertes Docker-Image

Ablauf der Zielarchitektur

Diagram showing AWS App2Container process for containerizing Java app on Linux system.
  1. Ermitteln Sie die Anwendungen, die auf dem Anwendungsserver ausgeführt werden, und analysieren Sie die Anwendungen.

  2. Containerisieren Sie die Anwendungen.

  3. Bewerten Sie die Größe des Docker-Images. Wenn das Bild zu groß ist, fahren Sie mit Schritt 4 fort.

  4. Verwenden Sie das Shell-Skript (im Anhang), um große Dateien zu identifizieren.

  5. Aktualisieren Sie die appSpecificFiles Listen appExcludedFiles und in der analysis.json Datei.

Tools

Tools

  • AWS App2Container — AWS App2Container (A2C) ist ein Befehlszeilentool, mit dem Sie Anwendungen, die in Ihrem lokalen Rechenzentrum oder auf virtuellen Maschinen ausgeführt werden, nach oben verschieben können, sodass sie in Containern ausgeführt werden, die von Amazon Elastic Container Service (Amazon ECS) oder Amazon Elastic Kubernetes Service (Amazon EKS) verwaltet werden.

Code

Das optimizeImage.sh Shell-Skript und eine Beispieldatei sind angehängt. analysis.json

Die optimizeImage.sh Datei ist ein Utility-Skript zur Überprüfung des Inhalts der von App2Container generierten Datei,. ContainerFiles.tar Bei der Überprüfung werden Dateien oder Unterverzeichnisse identifiziert, die groß sind und ausgeschlossen werden können. Das Skript ist ein Wrapper für den folgenden Tar-Befehl.

tar -Ptvf <path>|tr -s ' '|cut -d ' ' -f3,6| awk '$2 ~/<filetype>$/'| awk '$2 ~/^<toplevel>/'| cut -f1-<depth> -d'/'|awk '{ if ($1>= <size>) arr[$2]+=$1 } END { for (key in arr) { if(<verbose>) printf("%-50s\t%-50s\n", key, arr[key]) else printf("%s,\n", key) } } '|sort -k2 -nr

Im Befehl tar verwendet das Skript die folgenden Werte:

path

Der Pfad zu ContainerFiles.tar

filetype

Der passende Dateityp

toplevel

Das Verzeichnis auf oberster Ebene, das dem entsprechen soll

depth

Die Tiefe des absoluten Pfads

size

Die Größe für jede Datei

Das -Skript führt folgende Aktionen aus:

  1. Es wird verwendettar -Ptvf, um die Dateien aufzulisten, ohne sie zu extrahieren.

  2. Es filtert die Dateien nach Dateityp, beginnend mit dem Verzeichnis der obersten Ebene.

  3. Basierend auf der Tiefe generiert es den absoluten Pfad als Index.

  4. Basierend auf dem Index und den Speichern gibt es die Gesamtgröße des Unterverzeichnisses an.

  5. Es gibt die Größe des Unterverzeichnisses aus.

Sie können die Werte auch manuell im Befehl tar ersetzen.

Epen

AufgabeBeschreibungErforderliche Fähigkeiten
Entdecken Sie die lokalen Java-Anwendungen.

Führen Sie den folgenden Befehl aus, um alle Anwendungen zu ermitteln, die auf dem Anwendungsserver ausgeführt werden.

sudo app2container inventory 
AWS DevOps
Analysieren Sie die erkannten Anwendungen.

Führen Sie den folgenden Befehl ausapplication-id, um jede Anwendung anhand der in der Inventarphase abgerufenen Anwendungen zu analysieren.

sudo app2container analyze --application-id <java-app-id>
AWS DevOps
Containerisieren Sie die analysierten Anwendungen.

Führen Sie den folgenden Befehl aus, um eine Anwendung zu containerisieren.

sudo app2container containerize --application-id <application-id>

Der Befehl generiert das Docker-Image zusammen mit einem Tar-Bundle am Workspace-Speicherort.

Wenn das Docker-Image zu groß ist, fahren Sie mit dem nächsten Schritt fort.

AWS DevOps
AufgabeBeschreibungErforderliche Fähigkeiten
Identifizieren Sie die Größe der Tar-Datei für Artefakte.

Identifizieren Sie die ContainerFiles.tar Datei{workspace}/{java-app-id}/Artifacts, in der sich der App2Container-Workspace java-app-id befindet und wo workspace sich die Anwendungs-ID befindet. 

./optimizeImage.sh -p /{workspace}/{java-app-id}/Artifacts/ContainerFiles.tar -d 0 -t / -v

Dies ist die Gesamtgröße der TAR-Datei nach der Optimierung.

AWS DevOps
Listet die Unterverzeichnisse unter dem Verzeichnis/und ihre Größen auf.

Führen Sie den folgenden Befehl aus, um die Größe der wichtigsten Unterverzeichnisse unter dem Verzeichnis der / obersten Ebene zu ermitteln.

./optimizeImage.sh -p /{workspace}/{java-app-id}/Artifacts/ContainerFiles.tar -d 1 -t / -s 1000000 -v /var                         554144711 /usr 2097300819 /tmp 18579660 /root 43645397 /opt 222320534 /home 65212518 /etc 11357677                                    
AWS DevOps
Identifizieren Sie große Unterverzeichnisse unter dem Verzeichnis/.

Identifizieren Sie für jedes Hauptunterverzeichnis, das im vorherigen Befehl aufgeführt ist, die Größe seiner Unterverzeichnisse. Wird verwendet-d, um die Tiefe zu erhöhen und das -t Verzeichnis der obersten Ebene anzugeben.

Verwenden Sie es beispielsweise /var als Verzeichnis der obersten Ebene. Identifizieren Sie /var unter alle großen Unterverzeichnisse und ihre Größe.

./optimizeImage.sh -p /{workspace}/{java-app-id}/Artifacts/ContainerFiles.tar -d 2 -t /var -s 1000000 -v

Wiederholen Sie diesen Vorgang für jedes Unterverzeichnis, das im vorherigen Schritt aufgeführt wurde (z. B., /usr /tmp/opt, und/home).

AWS DevOps
Analysieren Sie den großen Ordner in jedem Unterverzeichnis unter dem Verzeichnis/.

Identifizieren Sie für jedes Unterverzeichnis, das im vorherigen Schritt aufgeführt wurde, alle Ordner, die zum Ausführen der Anwendung erforderlich sind.

Verwenden Sie beispielsweise die Unterverzeichnisse aus dem vorherigen Schritt und listen Sie alle Unterverzeichnisse im /var Verzeichnis und deren Größe auf. Identifizieren Sie alle Unterverzeichnisse, die von der Anwendung benötigt werden.

/var/tmp                        237285851 /var/lib 24489984 /var/cache                      237285851

Um Unterverzeichnisse auszuschließen, die von der Anwendung nicht benötigt werden, fügen Sie diese Unterverzeichnisse in der analysis.json Datei dem appExcludedFiles Abschnitt darunter hinzu. containerParameters

Eine analysis.json Beispieldatei ist angehängt.

AWS DevOps
Identifizieren Sie die benötigten Dateien aus der AppExcludes-Liste.

Identifizieren Sie für jedes Unterverzeichnis, das der AppExcludes-Liste hinzugefügt wird, alle Dateien in diesem Unterverzeichnis, die von der Anwendung benötigt werden. Fügen Sie in der Datei analysis.json die spezifischen Dateien oder Unterverzeichnisse im Abschnitt darunter hinzu. appSpecificFiles containerParameters 

Wenn das /usr/lib Verzeichnis beispielsweise zur Ausschlussliste hinzugefügt wird, aber von der Anwendung benötigt /usr/lib/jvm wird, fügen Sie /usr/lib/jvm es dem Abschnitt hinzu. appSpecificFiles

AWS DevOps
AufgabeBeschreibungErforderliche Fähigkeiten
Containerisieren Sie die analysierte Anwendung.

Führen Sie den folgenden Befehl aus, um die Anwendung zu containerisieren.

sudo app2container containerize --application-id <application-id>

Der Befehl generiert das Docker-Image zusammen mit einem Tar-Bundle am Workspace-Speicherort.

AWS DevOps
Identifizieren Sie die Größe der Tar-Datei für Artefakte.

Identifizieren Sie die ContainerFiles.tar Datei{workspace}/{java-app-id}/Artifacts, in der sich der App2Container-Workspace  java-app-id befindet und wo  workspace sich die Anwendungs-ID befindet. 

./optimizeImage.sh -p /{workspace}/{java-app-id}/Artifacts/ContainerFiles.tar -d 0 -t / -v

Dies ist die Gesamtgröße der TAR-Datei nach der Optimierung. 

AWS DevOps
Führen Sie das Docker-Image aus.

Um zu überprüfen, ob das Image ohne Fehler gestartet wird, führen Sie das Docker-Image lokal mit den folgenden Befehlen aus.

Um den des  imageId Containers zu identifizieren, verwenden Siedocker images |grep java-app-id.

Um den Container auszuführen, verwenden Siedocker run -d <image id>.

AWS DevOps

Zugehörige Ressourcen

Anlagen

Um auf zusätzliche Inhalte zuzugreifen, die mit diesem Dokument verknüpft sind, entpacken Sie die folgende Datei: attachment.zip