Container sind ein wesentlicher Bestandteil der heutigen Arbeit für Entwickler und Betreiber. Sie bieten eine elegante Möglichkeit, benötigte Anwendungen im Handumdrehen bereitzustellen oder im großen Maßstab in der Cloud oder einem Rechenzentrum zu betreiben.

Diese Anleitung zeigt eine von mehreren Möglichkeiten, ein solches Container-Image zu erstellen. Die Anwendung, die ich in diesem Beispiel verwende, ist etcd. etcd ist ein verteilter, zuverlässiger Key-Value-Speicher für die wichtigsten Daten eines verteilten Systems. In meiner täglichen Arbeit ist etcd Teil von hochverfügbarem PostgreSQL mit Patroni.

Wenn Sie neu bei etcd sind, schauen Sie sich etcd’s Playground an

Der Inhalt dieses Blog-Eintrags ist auch in meinem Github Repository verfügbar!

Voraussetzungen

Ich verwende derzeit Ubuntu 22.04. Bevor wir mit der Arbeit am Container-Image beginnen können, installieren wir einige Pakete mit apt:

podman ist ein Daemon-loses, Open-Source, Linux-natives Tool, das entwickelt wurde, um das Finden, Ausführen, Erstellen, Teilen und Bereitstellen von Anwendungen mit Open Containers Initiative (OCI) Containern und Container-Images zu erleichtern. Wenn Sie bereits mit Docker vertraut sind, werden Sie wahrscheinlich wissen, was vor sich geht. Podman bietet mehrere Vorteile gegenüber Docker: Der vielleicht wichtigste ist, dass Container im rootless-Modus ausgeführt werden können. Darüber hinaus haben Unternehmen wie RedHat oder SUSE in der Vergangenheit von Docker auf Podman umgestellt, um ihre Container-Plattformen zu vervollständigen.

buildah ist ein Tool zur Erleichterung des Aufbaus von OCI-Container-Images. Buildah und Podman ergänzen sich gegenseitig.

Aus Komfortgründen und um einen kleinen Proof of Concept zu ermöglichen, wird auch das podman-compose Python-Skript installiert.

Copy to Clipboard

Das Image erstellen

buildah ermöglicht die Erstellung von Images von Grund auf. Man beginnt einfach mit einem leeren Container, der nur einige Metadaten enthält. In diesem Artikel verwende ich RedHat’s UBI minimal Image. Alle folgenden Schritte sind Teil eines Skripts, um den Build-Prozess zu beschleunigen und zu automatisieren, und werden im privilegierten Modus als Benutzer root ausgeführt.

Zuerst setzen wir Umgebungsvariablen für die etcd-Version und den Download-Ort von etcd:

Copy to Clipboard

Laden Sie die etcd-Binärdateien herunter:

Copy to Clipboard

Extrahieren Sie nur eine Teilmenge der Objekte aus dem Tarball. Nur die Binärdateien werden benötigt:

Copy to Clipboard

Verwenden Sie dann buildah, um einen neuen minimalen Container namens etcd zu erstellen, der auf dem ubi-minimal Image basiert:

Copy to Clipboard

Es empfiehlt sich, einige Metadaten über den Container hinzuzufügen. Hier füge ich in diesem Beispiel nur mich selbst als Autor hinzu, aber Sie könnten zusätzliche Metadaten für Ihre Organisation hinzufügen:

Copy to Clipboard

Ich möchte mein etcd mit einem Standard-Benutzer und einer Standard-Gruppe namens etcd ausführen. Daher wird das shadow-utils-Paket installiert, um den groupadd– und useradd-Befehl zu verwenden. Nach der Erstellung der Gruppe und des Benutzers werden die Pakete wieder entfernt und der microdnf-Cache geleert. Der Benutzer etcd wird als Standard-Benutzer festgelegt und das Arbeitsverzeichnis ist sein Home-Verzeichnis:

Copy to Clipboard

Auch wenn Container standardmäßig volatil sind, benötigen einige Anwendungen, z.B. Datenbanken, ein Datenverzeichnis für die Persistenz. In diesem Fall wird das Datenverzeichnis etcddata erstellt und dem Benutzer etcd zugewiesen. Zusätzlich wird etcd durch Setzen der Umgebungsvariable ETCD_DATA_DIR über sein Datenverzeichnis informiert. In einem realen Szenario ist ein Volume erforderlich, um die Daten von etcd zu persistieren:

Copy to Clipboard

Dem Container fehlen noch die etcd-Binärdateien. Kopieren Sie diese drei Binärdateien in das Image:

Copy to Clipboard

Jeder Container benötigt einen Entrypoint für den Start. Für etcd rufen Sie einfach die etcd-Binärdatei auf:

Copy to Clipboard

Das war’s! Andere Anwendungen oder Anwendungsfälle erfordern möglicherweise einen größeren Satz von Befehlen zum Erstellen eines Container-Images. Für das etcd-Container-Image müssen Sie nur den neuen Container unmounten und committen. Vergessen Sie nicht, Ihr Image angemessen zu taggen:

Copy to Clipboard

Der heruntergeladene etcd-Tarball und die extrahierten Binärdateien werden nicht mehr benötigt. Entfernen Sie sie:

Copy to Clipboard

Schließlich fügen Sie alle Schritte in ein Skript ein, und Sie sind fertig.

Test

Der Container ist sichtbar, wenn manbuildah containersaufruft.

Copy to Clipboard

Das neu getaggte Image ist ebenfalls verfügbar.

Copy to Clipboard

Es ist sogar möglich, das Image zu inspizieren und eine Vorstellung von seinem Aufbau zu bekommen.

Copy to Clipboard

Demo

Das Container-Image ist einsatzbereit. Versuchen wir, einen Drei-Node-etcd-Cluster mit podman-compose und einer minimalistischen Konfiguration einzurichten. Die compose.yml sieht folgendermaßen aus. Die Umgebungsvariablen sind Teil einer .env-Datei, die sich im selben Verzeichnis befindet.

Copy to Clipboard

Führen Sie einfach das zusammengesetzte Setup aus, warten Sie ein paar Sekunden und voilà: Der etcd-Cluster läuft.

Copy to Clipboard

Überprüfen Sie zunächst die Cluster-Mitgliederliste:

Copy to Clipboard

Zweitens, validieren Sie den Cluster-Health-Status:

Copy to Clipboard

Zu guter Letzt, setzen Sie einen Wert in den Speicher:

Copy to Clipboard

Und lesen Sie ihn wieder aus:

Copy to Clipboard

Fazit

Die Arbeit mit podman und buildah ist recht einfach. Beide Tools verfügen über eine große Bandbreite an Funktionen, um Ihren Entwicklungs- oder Betriebsanforderungen gerecht zu werden. Wenn also die öffentlich verfügbaren Container-Images aus gängigen Quellen Ihren Bedürfnissen nicht entsprechen, erstellen Sie einfach Ihre eigenen Container-Images.

Blog Dirk Aumüller

Dirk Aumüller

Dirk Aumueller arbeitet als Associate Partner für die Proventa AG. Sein technologischer Schwerpunkt liegt bei Datenbankarchitekturen mit PostgreSQL sowie Data Management Lösungen mit Pentaho. Zusätzlich zu seinen Datenbanktransformations-Projekteinsätzen ist er regelmäßig als PostgreSQL Trainer unterwegs und betreut Studenten bei ihren Abschlussarbeiten. Seine fachlichen Erfahrungen erstrecken sich über die Branchen Telco und Financial Services.