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.
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:
Laden Sie die etcd-Binärdateien herunter:
Extrahieren Sie nur eine Teilmenge der Objekte aus dem Tarball. Nur die Binärdateien werden benötigt:
Verwenden Sie dann buildah, um einen neuen minimalen Container namens etcd zu erstellen, der auf dem ubi-minimal Image basiert:
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:
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:
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:
Dem Container fehlen noch die etcd-Binärdateien. Kopieren Sie diese drei Binärdateien in das Image:
Jeder Container benötigt einen Entrypoint für den Start. Für etcd rufen Sie einfach die etcd-Binärdatei auf:
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:
Der heruntergeladene etcd-Tarball und die extrahierten Binärdateien werden nicht mehr benötigt. Entfernen Sie sie:
Schließlich fügen Sie alle Schritte in ein Skript ein, und Sie sind fertig.
Test
Der Container ist sichtbar, wenn manbuildah containers
aufruft.
Das neu getaggte Image ist ebenfalls verfügbar.
Es ist sogar möglich, das Image zu inspizieren und eine Vorstellung von seinem Aufbau zu bekommen.
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.
Führen Sie einfach das zusammengesetzte Setup aus, warten Sie ein paar Sekunden und voilà: Der etcd-Cluster läuft.
Überprüfen Sie zunächst die Cluster-Mitgliederliste:
Zweitens, validieren Sie den Cluster-Health-Status:
Zu guter Letzt, setzen Sie einen Wert in den Speicher:
Und lesen Sie ihn wieder aus:
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.