Website-Suche

So verwalten Sie Container mit Podman und Skopeo in RHEL 8


Eine der Herausforderungen, mit denen Entwickler in der Vergangenheit konfrontiert waren, bestand darin, Anwendungen in mehreren Computerumgebungen zuverlässig laufen zu lassen. Oftmals liefen Anwendungen nicht wie erwartet oder es traten Fehler auf und scheiterten gänzlich. Und hier wurde das Konzept der Container geboren.

Was sind Containerbilder?

Container-Images sind statische Dateien, die mit ausführbarem Code geliefert werden, der in einer isolierten Umgebung ausgeführt wird. Ein Container-Image umfasst Systembibliotheken, Abhängigkeiten und andere Plattformeinstellungen, die die Anwendung für die Ausführung in verschiedenen Umgebungen benötigt.

Red Hat Linux bietet eine Reihe nützlicher Container-Tools, die Sie nutzen können, um mithilfe erforderlicher Docker-Befehle direkt mit Linux-Containern zu arbeiten. Diese beinhalten:

  • Podman – Dies ist eine daemonlose Container-Engine zum Ausführen und Verwalten von OCI-Containern im Root- oder Rootless-Modus. Podman ähnelt Docker und verfügt über dieselben Befehlsoptionen, außer dass Docker ein Daemon ist. Sie können Container-Images mit podman auf die gleiche Weise abrufen, ausführen und verwalten wie mit Docker. Podman verfügt über viele erweiterte Funktionen, lässt sich vollständig in Systeme integrieren und bietet Unterstützung für Benutzer-Namespaces, einschließlich der Ausführung von Containern, ohne dass ein Root-Benutzer erforderlich ist.
  • Skopeo: Dies ist ein Befehlszeilentool, das zum Kopieren von Container-Images von einer Registrierung in eine andere verwendet wird. Sie können Skopeo verwenden, um Bilder von und zu einem bestimmten Host zu kopieren sowie Bilder in eine andere Container-Registrierung oder Umgebung zu kopieren. Neben dem Kopieren von Bildern können Sie damit auch Bilder aus verschiedenen Registern überprüfen und mithilfe von Signaturen Bilder erstellen und überprüfen.
  • Buildah: Hierbei handelt es sich um eine Reihe von Befehlszeilentools, die zum Erstellen und Verwalten von OCI-Containerbildern mithilfe von Docker-Dateien verwendet werden.

In diesem Artikel konzentrieren wir uns auf die Verwaltung von Containern mit podman und Skopeo.

Durchsuchen von Container-Images aus einer Remote-Registrierung

Mit dem Befehl podman search können Sie ausgewählte Remote-Registrierungen nach Container-Images durchsuchen. Die Standardliste der Registrierungen ist in der Datei registries.conf definiert, die sich im Verzeichnis /etc/containers/ befindet.

Die Register werden durch 3 Abschnitte definiert.

  • [registries.search] – Dieser Abschnitt gibt die Standardregister an, die podman nach Container-Images durchsuchen kann. Es sucht nach dem angeforderten Bild in den Registrierungen registry.access.redhat.com, registry.redhat.io und docker.io.

  • [registries.insecure] – In diesem Abschnitt werden Registrierungen angegeben, die keine TLS-Verschlüsselung implementieren, d. h. unsichere Registrierungen. Standardmäßig sind keine Einträge angegeben.

  • [registries.block] – Dies blockiert oder verweigert den Zugriff auf die angegebenen Registrierungen von Ihrem lokalen System aus. Standardmäßig sind keine Einträge angegeben.

Als normaler Benutzer (ohne Root), der den Befehl podman ausführt, können Sie Ihre eigene registries.conf-Datei in Ihrem Home-Verzeichnis ($HOME/.config) definieren /containers/registries.conf), um systemweite Einstellungen zu überschreiben.

Regeln bei der Angabe von Registern

Beachten Sie beim Festlegen der Register Folgendes:

  • Jede Registrierung sollte in einfache Anführungszeichen gesetzt werden.
  • Registrierungen können entweder mit einem Hostnamen oder einer IP-Adresse angegeben werden.
  • Wenn mehrere Register angegeben sind, sollten diese durch Kommas getrennt werden.
  • Wenn eine Registrierung einen nicht standardmäßigen Port verwendet – entweder den TCP-Port 443 für sicher und 80 für unsicher – sollte die Portnummer zusammen mit dem Registrierungsnamen angegeben werden, z. B. registry.example.com:5566.

So durchsuchen Sie eine Registrierung nach einem Container-Image mithilfe der folgenden Syntax:

podman search registry/container_image

Um beispielsweise in der Registrierung registry.redhat.io nach einem Redis-Image zu suchen, rufen Sie den folgenden Befehl auf:

podman search registry.redhat.io/redis

Um nach einem MariaDB-Container-Image zu suchen, führen Sie Folgendes aus:

podman search registry.redhat.io/mariadb

Um eine ausführliche Beschreibung eines Container-Images zu erhalten, verwenden Sie in den Ergebnissen, die Sie erhalten, die Option --no-trunc vor dem Namen des Container-Images. Wir werden beispielsweise versuchen, eine detaillierte Beschreibung des MariaDB-Container-Images zu erhalten, wie hier gezeigt:

podman search --no-trunc registry.redhat.io/rhel8/mariadb-103

Containerbilder abrufen

Das Abrufen oder Abrufen von Container-Images aus einer Remote-Registrierung erfordert vor allem anderen, dass Sie sich zunächst authentifizieren. Um beispielsweise das MariaDB-Container-Image abzurufen, melden Sie sich zunächst bei der Redhat-Registrierung an:

podman login

Geben Sie Ihren Benutzernamen und Ihr Passwort ein und drücken Sie „ENTER“ auf Ihrer Tastatur. Wenn alles gut geht, sollten Sie eine Bestätigungsmeldung erhalten, dass die Anmeldung bei der Registrierung erfolgreich war.

Login Succeeded!

Jetzt können Sie das Bild mit der gezeigten Syntax abrufen:

podman pull <registry>[:<port>]/[<namespace>/]<name>:<tag>

Der <registry> bezieht sich auf den Remote-Host oder die Remote-Registrierung, die ein Repository von Container-Images auf dem TCP <port> bereitstellt. Der <namespace> und der <name> geben gemeinsam ein Container-Image an, das auf dem <namespace> in der Registrierung basiert. Schließlich gibt die Option <tag> die Version des Container-Images an. Wenn keines angegeben ist, wird das Standard-Tag „latest“ verwendet.

Es wird immer empfohlen, vertrauenswürdige Register hinzuzufügen, also solche, die Verschlüsselung bieten und es anonymen Benutzern nicht erlauben, Konten mit zufälligen Namen zu erstellen.

Um das MariaDB-Image abzurufen, führen Sie den folgenden Befehl aus:

podman pull registry.redhat.io/rhel8/mariadb-103
  • Der <registry> – Registry.redhat.io
  • Der <namespace> – rhel8
  • Der <name> – MariaDB
  • Der <tag> – 103

Für den nachfolgenden Container-Image-Pull ist keine weitere Anmeldung erforderlich, da Sie bereits authentifiziert sind. Um ein Redis-Container-Image abzurufen, führen Sie einfach Folgendes aus:

podman pull registry.redhat.io/rhscl/redis-5-rhel7

Auflisten von Containerbildern

Sobald Sie mit dem Abrufen der Bilder fertig sind, können Sie die derzeit auf Ihrem Host vorhandenen Bilder anzeigen, indem Sie den Befehl podman images ausführen.

podman images

Überprüfen von Containerbildern

Bevor Sie einen Container ausführen, ist es immer eine gute Idee, das Image zu untersuchen und zu verstehen, was es tut. Der Befehl podman inspect gibt eine Vielzahl von Metadaten über den Container aus, z. B. das Betriebssystem und die Architektur.

Um ein Image zu überprüfen, führen Sie den Befehl podman inspect gefolgt von der Image-ID oder dem Repository aus.

podman inspect IMAGE ID
OR
podman inspect REPOSITORY

Im folgenden Beispiel untersuchen wir den MariaDB-Container.

podman inspect registry.redhat.io/rhel8/mariadb-103

Um bestimmte Metadaten für einen Container abzurufen, übergeben Sie die Option --format gefolgt von den Metadaten und der Containeridentität (Bild-ID oder Name).

Im folgenden Beispiel rufen wir Informationen über die Architektur und Beschreibung des RHEL 8-Basiscontainers ab, der unter den Abschnitt „Labels“ fällt.

podman inspect --format=’{{.Labels.architecture}}’ image ID
podman inspect --format=’{{.Labels.description}}’ image ID

Um ein Remote-Image aus einer anderen Registrierung zu überprüfen, verwenden Sie den Befehl skopeo inspect. Im folgenden Beispiel untersuchen wir ein RHEL 8-Init-Image, das auf Docker gehostet wird.

skopeo inspect docker://registry.redhat.io/rhel8-beta/rhel-init

Containerbilder markieren

Wie Sie vielleicht bemerkt haben, sind Bildnamen normalerweise allgemeiner Natur. Das Redis-Image trägt beispielsweise die Bezeichnung:

registry.redhat.io/rhscl/redis-5-rhel7

Durch das Markieren von Bildern erhalten diese einen intuitiveren Namen, um besser zu verstehen, was sie enthalten. Mit dem Befehl podman tag können Sie ein Bild-Tag erstellen, das im Wesentlichen ein Alias für einen Bildnamen ist, der aus verschiedenen Teilen besteht.

Diese sind:

registry/username/NAME:tag

Um beispielsweise den generischen Namen des Redis-Images mit der ID 646f2730318c zu ändern, führen wir den folgenden Befehl aus:

podman tag 646f2730318c myredis

Um am Ende ein Tag hinzuzufügen, fügen Sie einen vollständigen Doppelpunkt gefolgt von der Tag-Nummer hinzu:

podman tag 646f2730318c myredis:5.0

Ohne das Hinzufügen der Tag-Nummer wird ihm lediglich das Attribut „Latest“ zugewiesen.

Container-Images ausführen

Um einen Container auszuführen, verwenden Sie den Befehl podman run. Zum Beispiel:

podman run image_id

Um einen Container unbeaufsichtigt im Hintergrund als Daemon-Dienst auszuführen, verwenden Sie die Option -d wie gezeigt.

podman run -d image_id

Um beispielsweise das redis-Image mit der ID 646f2730318c auszuführen, rufen wir den folgenden Befehl auf:

podman run -d 646f2730318c

Wenn Sie einen Container ausführen, der auf einem Betriebssystem wie dem RHEL 8-Basisimage basiert, können Sie mithilfe der -it-Direktive auf die Shell zugreifen. Die Option -i erstellt eine interaktive Sitzung, während die Option -t eine Terminalsitzung startet. Die Option --name legt den Containernamen auf mybash fest, während es sich um die ecbc6f53bba0-Image-ID des Basisimages handelt.

podman run -it --name=mybash ecbc6f53bba0

Anschließend können Sie beliebige Shell-Befehle ausführen. Im folgenden Beispiel überprüfen wir die Betriebssystemversion des Container-Images.

cat /etc/os-release

Um den Container zu verlassen, rufen Sie einfach den Exit-Befehl auf.

exit

Sobald der Container verlassen wird, stoppt er automatisch. Um den Container erneut zu starten, verwenden Sie den Befehl podman start mit dem Flag -ai wie gezeigt.

podman start -ai mybash

Dadurch erhalten Sie erneut Zugriff auf die Shell.

Auflisten laufender Container-Images

Um aktuell ausgeführte Container aufzulisten, verwenden Sie den Befehl podman ps wie gezeigt.

podman ps

Um alle Container anzuzeigen, einschließlich derjenigen, die nach der Ausführung beendet wurden, verwenden Sie den folgenden Befehl:

podman ps -a

Konfigurieren Sie Container-Images für den automatischen Start unter dem Systemd-Dienst

In diesem Abschnitt konzentrieren wir uns darauf, wie ein Container so konfiguriert werden kann, dass er direkt auf einem RHEL-System als systemd-Dienst ausgeführt wird.

Besorgen Sie sich zunächst Ihr Wunschbild. In diesem Fall haben wir das Redis-Image vom Docker Hub abgerufen:

podman pull docker.io/redis

Wenn SELinux auf Ihrem System ausgeführt wird, müssen Sie den booleschen Wert container_manage_cgroup aktivieren, um Container mit systemd auszuführen.

setsebool -p container_manage_cgroup on

Führen Sie anschließend das Container-Image im Hintergrund aus und weisen Sie ihm Ihren bevorzugten Image-Namen zu. In diesem Beispiel haben wir unser Image redis_server genannt und den Port 6379 vom Container unserem RHEL 8-Host zugeordnet

podman run -d --name redis_server -p 6379:6379 redis

Als Nächstes erstellen wir eine systemd-Einheitenkonfigurationsdatei für Redis im Verzeichnis /etc/systemd/system/.

vim /etc/systemd/system/redis-container.service

Fügen Sie den folgenden Inhalt in die Datei ein.

[Unit]
Description=Redis container

[Service]
Restart=always
ExecStart=/usr/bin/podman start -a redis_server
ExecStop=/usr/bin/podman stop -t 2 redis_server

[Install]
WantedBy=local.target

Speichern und beenden Sie die Datei.

Als nächstes konfigurieren Sie den Container so, dass er beim Booten automatisch startet.

systemctl enable redis-container.service

Starten Sie als Nächstes den Container und überprüfen Sie seinen Ausführungsstatus.

systemctl start redis-container.service
systemctl status redis-container.service

Konfigurieren Sie den persistenten Speicher für Container-Images

Beim Ausführen von Containern ist es ratsam, dauerhaften externen Speicher auf dem Host zu konfigurieren. Dies bietet eine Sicherung für den Fall, dass der Container abstürzt oder versehentlich entfernt wird.

Um die Daten beizubehalten, ordnen wir ein Verzeichnis im Host einem Verzeichnis im Container zu.

podman run --privileged -it -v /var/lib/containers/backup_storage:/mnt registry.redhat.io/ubi8/ubi /bin/bash

Die Option --privileged wird übergeben, wenn SELinux auf „erzwingen“ eingestellt ist. Die Option -v gibt das externe Volume an, das sich auf dem Host befindet. Das Container-Volume ist hier das Verzeichnis /mnt.

Sobald wir auf die Shell zugegriffen haben, erstellen wir wie gezeigt eine Beispieldatei testing.txt im Verzeichnis /mnt.

echo "This tests persistent external storage" > /mnt/testing.txt

Anschließend verlassen wir den Container und prüfen, ob die Datei im externen Speicher auf dem Host vorhanden ist

exit
cat /var/lib/containers/backup_storage/testing.txt

AusgabeDies testet den persistenten externen Speicher.

Container stoppen und entfernen

Sobald Sie mit der Ausführung Ihres Containers fertig sind, können Sie ihn mit dem Befehl podman stop stoppen, gefolgt von der container-id, die Sie vom podman ps< erhalten Befehl.

podman stop container-id

Um die Container zu entfernen, die Sie nicht mehr benötigen, stellen Sie zunächst sicher, dass Sie sie stoppen und dann den Befehl podman rm aufrufen, gefolgt von der Container-ID oder dem Namen als Option.

podman rm container-id

Um mehrere Container auf einmal mit einem Befehl zu entfernen, geben Sie die Container-IDs durch ein Leerzeichen getrennt an.

podman rm container-id-1 container-id-2 container-id-3

Um alle Ihre Container zu leeren, führen Sie den folgenden Befehl aus:

podman rm -a

Ein Bild entfernen

Um ein Bild zu entfernen, stellen Sie zunächst sicher, dass alle aus den Bildern erzeugten Container gestoppt und entfernt werden, wie im vorherigen Unterthema beschrieben.

Fahren Sie als Nächstes fort und führen Sie den Befehl podman -rmi gefolgt von der ID des Bildes aus, wie gezeigt:

podman -rmi image-id

Abschluss

Damit ist dieses Kapitel über die Verwaltung und Arbeit mit Containern in RHEL 8 abgeschlossen. Wir hoffen, dass dieser Leitfaden ein gutes Verständnis von Containern vermittelt und zeigt, wie Sie mit podman und Skopeo auf Ihrem RHEL-System interagieren und diese verwalten können.