GNU/Linux >> LINUX-Kenntnisse >  >> Linux

So containerisieren Sie Legacy-Anwendungen

Einführung

Unternehmen auf der ganzen Welt verfolgen einen auf Microservices basierenden, containergesteuerten Ansatz für die Softwarebereitstellung. Allerdings wurde die meiste Software entwickelt und geschrieben, bevor es moderne, bildbasierte Container gab.

Wenn Sie den Übergang zu einem Docker-Container-Bereitstellungsmodell planen, müssen Sie die Auswirkungen berücksichtigen, die die Migration auf Ihre vorhandenen Anwendungen haben wird.

In diesem Tutorial werden die erforderlichen Vorbereitungsarbeiten und grundlegende Docker-Befehle für die Containerisierung älterer Anwendungen beschrieben.

Warum Legacy-Apps containerisieren?

Unternehmen, die die Bereitstellung von Container-Software übernehmen, müssen ihre Organisation umstrukturieren, um die Prozesse des neuen Container-Workflows widerzuspiegeln. Die Analyse der potenziellen Vorteile der Containerbereitstellung ist hilfreich, um den besten Ansatz für Ihre Anwendung zu ermitteln.

Effizienz und Portabilität

Die Bereitstellung von Containern kann eine effektive Lösung sein, da Container in der Regel innerhalb von Sekunden gestartet werden. Das Container-Image enthält alle Binärdateien, Bibliotheken und Abhängigkeiten, sodass keine umgebungsspezifischen Konfigurationen hinzugefügt werden müssen. Dasselbe Image ist jetzt über mehrere Systeme hinweg übertragbar. Das Image ist frei von Umgebungseinschränkungen, was Bereitstellungen zuverlässig, portabel und skalierbar macht. Durch das Containerisieren von Anwendungen trennen Sie das Dateisystem und die Laufzeit von seinem Host.

Wartbarkeit und Skalierung

Anstatt eine umfangreiche monolithische Anwendung zu verwalten, erstellen Sie ein Architekturmuster, in dem komplexe Anwendungen aus kleinen, unabhängigen Prozessen bestehen, die über APIs miteinander kommunizieren.

Durch das Lösen von Anwendungskonflikten zwischen verschiedenen Umgebungen können Entwickler ihre Software und Abhängigkeiten mit IT-Betriebs- und Produktionsumgebungen teilen. Entwickler und IT-Betrieb sind eng miteinander verbunden und können effektiv zusammenarbeiten. Der Container-Workflow bietet Dev Ops die Kontinuität, die sie benötigen. Die Fähigkeit, Probleme früh im Entwicklungszyklus zu erkennen, reduziert die Kosten einer größeren Überholung zu einem späteren Zeitpunkt.

Container-Management-Tools

Containerverwaltungstools von Drittanbietern bieten einen Mechanismus für die Vernetzung, Überwachung und dauerhafte Speicherung von containerisierten Anwendungen. Legacy-Anwendungen können modernste Orchestrierungs-Frameworks wie Kubernetes nutzen.

Diese Tools verbessern die Betriebszeit, die Analysefunktionen und erleichtern die Überwachung des Anwendungszustands.

Container planen

Um Ihre Anwendungen erfolgreich zu migrieren, müssen Sie eine Strategie entwickeln, die die Anforderungen Ihrer Anwendungen in Verbindung mit der Natur von Containern untersucht. Auf technischer Ebene kann jede Anwendung in einem Container bereitgestellt werden. Es gibt mehrere mögliche Lösungen für die Bereitstellung einer Legacy-Anwendung in einem Container:

1. Schreiben und gestalten Sie Ihre Legacy-Anwendung komplett neu.

2. Führen Sie eine vorhandene monolithische Anwendung in einem einzigen Container aus.

3. Anwendungen erweitern und umgestalten, damit sie die Vorteile der neuen verteilten Architektur nutzen können.

Unabhängig vom gewählten Weg ist es entscheidend, richtig zu identifizieren, ob eine Anwendung überhaupt ein guter Kandidat für die Bereitstellung in einer Containerumgebung ist. Der Fokus muss auf Architektur, Leistung und Sicherheit liegen.

Architektur

Anwendungen müssen in einzelne Dienste zerlegt werden, damit sie individuell skaliert und bereitgestellt werden können. Um die Container-Bereitstellung voll auszuschöpfen, prüfen Sie, ob es möglich ist, Ihre vorhandene Anwendung in mehrere Container aufzuteilen.

Idealerweise sollte ein einzelner Prozess einem einzelnen Container zugeordnet werden. Auch Cron-Jobs sollten in separate Container ausgelagert werden. Dazu muss möglicherweise die Architektur Ihrer App überarbeitet werden.

Leistung

Stellen Sie fest, ob Ihre Anwendung bestimmte Hardwareanforderungen hat. Container verwenden Linux-Funktionen, die den zugrunde liegenden Kernel partitionieren. Es kann erforderlich sein, einzelne Container mit eindeutigen Parametern zu konfigurieren oder bestimmte Ressourcen bereitzustellen.

Beachten Sie außerdem, dass Docker keinen Init-Daemon hat um Zombie-Prozesse zu bereinigen. Stellen Sie sicher, dass Sie einen als ENTRYPOINT in Ihrer Dockerdatei angeben. Betrachten Sie dumb.ino als mögliche leichtgewichtige Lösung.

Sicherheit

Container bieten weniger Isolation als VMs, und es ist wichtig, das Sicherheitsniveau zu definieren, das Ihre Anwendung benötigt. Richten Sie strenge Einschränkungen für Benutzer- und Dienstkonten ein. Halten Sie Geheimnisse und Kennwörter von Ihren Container-Images isoliert, halten Sie sich an die Prinzipien der geringsten Rechte und sorgen Sie für eine Tiefenverteidigung, um Kubernetes-Cluster zu sichern.

Anforderungen an persistenten Speicher

Bei der Container-Orchestrierung werden nicht alle persistenten Daten in der beschreibbaren Ebene der Container gespeichert. Stattdessen werden permanente Daten auf klar definierten persistenten Volumes gespeichert. Dieser Ansatz stellt sicher, dass permanente Daten die Größe eines Containers nicht erhöhen und unabhängig vom Lebenszyklus des Containers vorhanden sind.

Wenn die permanenten Daten Ihrer Legacy-App über das Dateisystem verteilt sind oder in Pfade geschrieben werden, die mit der Anwendung selbst geteilt werden, empfehlen wir Ihnen, die Anwendung so umzustrukturieren, dass sie alle permanenten Daten in einen einzigen Pfad im Dateisystem schreibt. Dadurch wird die Migration von App-Daten in eine containerisierte Umgebung vereinfacht.

Dienste extern machen

Identifizieren Sie lokale Dienste, die ausgelagert und in separaten Containern ausgeführt werden können. Suchen Sie nach Caching- und Datenbankdiensten, diese können am einfachsten ausgelagert werden. Alternativ können Sie verwaltete Dienste verwenden, anstatt sie selbst zu konfigurieren und zu verwalten.

Bild für mehrere Umgebungen vorbereiten

Es wird erwartet, dass Sie ein einzelnes Docker-Image in einer Entwicklungs-, QA- und Produktionsumgebung verwenden. Berücksichtigen Sie umgebungsspezifische Konfigurationsvariablen. Wenn Sie welche identifizieren, müssen Sie ein Startskript schreiben, das die standardmäßigen Anwendungskonfigurationsdateien aktualisiert.

Legacy-Anwendung in Containern bereitstellen

Angenommen, Docker ist auf Ihrem System betriebsbereit und läuft, gibt es mehrere Möglichkeiten, ein Docker-Image zu erstellen:

  1. Verwenden Sie ein leeres Bild und fügen Sie zusätzliche Ebenen hinzu, indem Sie einen Satz externer Dateien importieren.
  2. Verwenden Sie die Befehlszeile, um interaktiv einzelne Docker-Befehle einzugeben und ein neues Image mit docker commit zu erstellen .
  3. Verwenden Sie ein ausgefeiltes Konfigurationsmanagement-Tool (z. B. als Puppet und Chef) für komplexe Bereitstellungen.
  4. Verwenden Sie ein vorhandenes Basis-Image und geben Sie eine Reihe von Befehlen in einer Dockerfile an .

Dockerfiles sind ein ausgezeichneter Ausgangspunkt, um zu verstehen, wie man eine Containerlaufzeit zum Erstellen eines Images verwendet. Wenn Sie einen Fehler machen, können Sie die Datei einfach ändern und mit einem einzigen Befehl ein neues Container-Image erstellen.

Legacy App Dockerfile

Ein Dockerfile ist eine einfache Textdatei mit einer Reihe von Befehlen, die in strenger Reihenfolge ausgeführt werden. Dockerfiles basieren normalerweise auf vorhandenen Images mit nur wenigen zusätzlichen Einstellungen. Verwenden Sie Ihre Befehlszeilenschnittstelle, um ein Verzeichnis zu erstellen, das die Dateien enthält, die Sie für Ihren Build benötigen:

mkdir ImageForLegacyApp
cd ImageForLegacyApp

Sobald der Build-Prozess beginnt, werden die Dateien in diesem Verzeichnis an den Docker-Daemon gesendet. Indem wir die Anzahl der Dateien einschränken, beschleunigen wir den Erstellungsprozess und sparen Speicherplatz.

Verwenden Sie Ihren bevorzugten Texteditor zum Codieren oder Programmieren (wir verwenden vim), um eine leere Dockerdatei innerhalb der ImageForLegacyApp zu erstellen Verzeichnis:

vim Dockerfile

Die folgenden Build-Anweisungen gelten für eine einfache PHP-Anwendung. Wir beginnen mit dem Ziehen eines Betriebssystems mit installiertem PHP und Apache.

FROM php:apache

FROM ist die erste Anweisung im Dockerfile. Es definiert das Basis-Image, in diesem Beispiel Debian OS mit installiertem PHP und Apache. Wenn Sie eine bestimmte Version eines Basisimages wünschen, stellen Sie sicher, dass Sie das entsprechende Tag verwenden (z. B. php:7.0-apache ).

COPY ./var/www/html

Verwenden Sie die COPY Befehl, um Ihren PHP-Code in das Bild zu kopieren. Verwenden Sie das ADD Befehl stattdessen, wenn eine tar-Extraktion erforderlich ist.

WORKDIR /var/www/html

Dies definiert den Arbeitsordner. Alle nachfolgenden Befehle gelten für diesen Ordner.

EXPOSE 80

Legen Sie den Port für die zu überwachende Anwendung mit EXPOSE fest Befehl. Nachdem Sie das Image initiiert und das laufende Image mit einem anderen Container verknüpft haben, steht der exponierte Port dem anderen Container zur Verfügung, als ob er sich auf demselben lokalen System befände.

CMD [“php”, “./legacy_app.php”]

Verwenden Sie die CMD Befehl, um den Standardbefehl zu identifizieren, der vom Image ausgeführt werden soll, zusammen mit den Optionen, die Sie ihm übergeben möchten. Sie können nur eine CMD-Zeile in einem Dockerfile haben.

LABEL version="1.1"

Wir verwenden das LABEL Anweisung zum Hinzufügen von Metadaten zum Bild. Neben dem Label, das Sie zuweisen, ruft das Bild alle Labels ab, die dem übergeordneten Bild zugewiesen sind, das mit FROM aufgerufen wird Befehl.

Erstellen eines Docker-Images

Wir haben die Anweisungen innerhalb der Dockerfile erfolgreich definiert. Starten Sie den Erstellungsprozess, indem Sie den folgenden Befehl in Ihr Befehlsterminal eingeben:

docker build -t legacyapp [location_of_Dockerfile]

Während des Build-Prozesses erhält jedes Image eine eindeutige ID. Um das Image in einer Registrierung einfach zu finden und zu identifizieren, verwenden Sie -t Befehl zum Benennen des Bildes. In diesem Beispiel erhält das Bild den Namen legacyapp .

docker build -t legacyapp .
  1. Der docker build Befehl weist den Docker-Daemon an, ein Image basierend auf der Docker-Datei zu erstellen.
  2. Der Pfad, der dem docker build bereitgestellt wird Befehl wird zum Hochladen von Dateien und Verzeichnissen verwendet.
  3. Jeder Build-Schritt wird nummeriert, während der Docker-Daemon mit der Ausführung der Befehle aus der Docker-Datei fortfährt.
  1. Jeder Befehl führt zu einem neuen Bild. Und die Bild-ID wird auf dem Bildschirm angezeigt.
  2. Jeder zwischengeschaltete Docker-Container wird entfernt, bevor mit dem nächsten Schritt fortgefahren wird, um Speicherplatz zu sparen.

Das Docker-Image ist fertig und Sie haben eine eindeutige ID-Referenz erhalten. Außerdem haben wir kein Versions-Tag verwendet, sodass Docker das Image automatisch als :latest gekennzeichnet hat .

Ein Docker-Image ausführen

Das Image kann jetzt bereitgestellt werden. Der docker run Unterbefehl startet den Container:

sudo docker run --name apache2 legacyapp

Der --name -Argument gibt dem Container einen eindeutigen Namen, während das Argument legacyapp Das Argument repräsentiert den Namen des statischen Docker-Images, das wir erstellt haben.

Geben Sie den folgenden Befehl ein, um eine Liste der gestarteten und entfernten Container anzuzeigen:

docker ps -a

Die Ausgabe bietet eine Übersicht zusammen mit einer Container-ID und einem Status.

Navigieren Sie zu localhost um zu überprüfen, ob Ihre App ordnungsgemäß vom Apache-Server bereitgestellt wird.


Linux
  1. So verbessern Sie die Startzeit von Anwendungen unter Linux

  2. So verwenden Sie Podman in einem Container

  3. So ändern Sie die Standardanwendungen von Debian

  4. Wie werden die Dateien gegenseitig nicht vertrauenswürdiger Apps in Linux geschützt?

  5. Wie kann die Speichernutzung der Anwendung begrenzt werden?

So fügen Sie eine Anwendung zur Liste der geöffneten Anwendungen in Ubuntu hinzu

Wie füge ich eine Anwendung zur Liste der mit Anwendungen geöffneten hinzu?

So erstellen Sie einen Django-Docker-Anwendungscontainer

So führen Sie SSH in einen Docker-Container ein

Schnelle Bereitstellung von Full-Stack-Anwendungen mit Portainer-Anwendungsvorlagen

So verwalten Sie Docker-Container