Eine coole Sache bei der Verwendung von Container-Tools wie Podman, Buildah, CRI-O und Skopeo ist, dass sie auf derselben Bibliothek zum Ziehen und Verschieben von Bildern basieren, nämlich Container/Image. Ich beschreibe oft die containers/image
Projekt als Bibliothek zum Kopieren von Bildern zwischen verschiedenen Arten von Containerspeichern. Dieser Speicher kann sich in einer Containerregistrierung, in Containern/Speicher, als Dateisystemobjekte wie Verzeichnisse oder Tarballs und sogar direkt im Docker-Daemon befinden. Der Mechanismus zum Verschieben dieser Container-Images zwischen den verschiedenen Containerspeichertypen wird als Transport bezeichnet . Eine der am wenigsten verstandenen Funktionen von containers/image
sind die verschiedenen Transporte, die es unterstützt.
Transporte
Das Bild wird mit einem transport:ImageName angegeben Format. Wenn kein Transport angegeben ist, wird der docker
(Container Registry)-Transport wird standardmäßig in allen Tools außer Skopeo verwendet. Skopeo verlangt, dass Benutzer immer den Transport einstellen.
Eines der coolen Dinge, die Docker getan hat, war die Idee einer Containerregistrierung , bei dem es sich im Grunde um einen Webserver handelt, der Container-Images enthält. Docker.io, quay.io und Artifactory sind Beispiele für Containerregistrierungen. Das Docker-Engineering-Team definierte ein Protokoll zum Abrufen und Übertragen dieser Images aus den Containerregistrierungen, das wir als docker
bezeichnen Transport.
[Das könnte Ihnen auch gefallen: 12 Podman-Leitfäden für die ersten Schritte mit Containern]
docker://docker-referenz
Eine Image-Referenz wird in einer Remote-Container-Image-Registrierung gespeichert. Beispiel:quay.io/podman/stable:latest
. Die Referenz kann einen Hostnamen für eine bestimmte Registrierung enthalten.
$ skopeo copy docker://docker.io/alpine dir:/tmp/alpine
$ podman run docker://registry.fedoraproject.org/fedora:latest echo hello
Für Podman und Buildah, docker://
ist der Standardtransport. Es kann der Einfachheit halber weggelassen werden:
$ podman pull registry.fedoraproject.org/fedora:latest
Bei Verwendung eines Kurznamens zum Ziehen eines Bildes wie fedora
, Podman und Buildah verwenden die Liste der Registrierungen, um eine Docker-Referenz zu erstellen, und rufen sie dann mit docker://
auf Transport.
Containers/image
unterstützt auch viele andere Transporte zum Kopieren und Speichern von Container-Images.
oci:Pfad
Der oci
transport exportiert/importiert den Inhalt eines Container-Images in ein lokales Verzeichnis, vorausgesetzt, das Image entspricht der Open Container Image Layout Specification. Die Manifest- und Layer-Tarballs werden als einzelne Dateien in das Verzeichnis exportiert.
$ skopeo copy oci:/tmp/myimage docker://registry.example.com/myimage
$ podman run oci:/tmp/fedora echo hello
Verzeichnis
Das dir
transport speichert den Inhalt eines Container-Images in einem lokalen Verzeichnis, wobei wiederum davon ausgegangen wird, dass das Image mit dem Docker-Image-Layout kompatibel ist. Das Manifest, Layer-Tarballs und Signaturen werden als einzelne Dateien in das Verzeichnis exportiert. Dies ist ein nicht standardisiertes Format, das hauptsächlich zum Debuggen oder zur nichtinvasiven Containerinspektion nützlich ist. Es ist dem oci
sehr ähnlich transport speichert die Dateien jedoch im alten Docker-Format.
$ podman save --format docker-dir fedora -o /tmp/fedora
$ podman run dir:/tmp/fedora echo hello
Docker-Archiv
Eine andere Möglichkeit, die die Docker-Ingenieure zum Speichern und Transportieren von Container-Images entwickelt haben, ist die Verwendung von tar
. Ein Tarball enthält alle Dateien, aus denen ein Container-Image besteht. Diese Tarballs wurden ursprünglich mit docker save
erstellt und podman save
Befehle. Sie könnten mit docker load
wieder in den lokalen Speicher der Container-Engine geladen werden und podman load
. Der containers/image
Die Bibliothek macht dieses Archivformat zu einem Transport, wodurch es direkt von anderen Befehlen wie podman run dir:/tmp/fedora.tag echo hello
verwendet werden kann , oder buildah from dir:/tmp/fedora.tar
$ skopeo copy docker://registry.fedoraproject.org/fedora:latest docker-archive:/tmp/fedora.img
$ podman run docker-archive:/tmp/fedora.img echo hello
Warnung :Verwendung von docker-archive
ist fast nie das Richtige. Das Format ist sowohl für die Speicherung als auch für die E/A sehr verschwenderisch. Ich würde empfehlen, dass Benutzer eine temporäre docker/distribution
ausführen Registrierung statt.
oci-archiv
Dieses Format ähnelt dem docker-archive
, aber anstatt das Legacy-Format zu sein, speichert es ein einzelnes Bild im OCI-Format. Der Pfad ist ein Bild, das der Open Container Image Layout Specification entspricht und sich in einem Verzeichnis am angegebenen Pfad befindet und mit einem Tag gekennzeichnet ist.
$ skopeo copy docker-archive:/tmp/fedora.img oci-archive:/tmp/fedora-oci.img
$ podman run oci-archive:/tmp/fedora-oci.img echo hello
Docker-Daemon
Eines der coolsten Features von containers/image
ist Unterstützung für den docker-daemon
Transport. Docker und Podman teilen sich nicht denselben Speicher. Sie können dies nicht, da Docker die Sperrung seines Speichers innerhalb des Daemons steuert. Während Podman, Buildah, CRI-O und Skopeo Inhalte teilen können, verwenden sie das Dateisystem über containers/storage
.
Podman und die anderen Tools können mit dem docker-daemon
arbeiten Speicherung indirekt über den docker-daemon
Transport. Dadurch können die Container-Engines direkt auf Bilder zugreifen, die zuvor vom Docker-Daemon abgerufen wurden, oder auf Bilder, die von docker build
erstellt wurden . Sie können auch von Buildah und Podman erstellte Images direkt in den Docker-Daemon verschieben.
Etwa so:
podman run docker-daemon:alpine echo hello
Hinweis :Podman zieht das Image aus dem Docker-Daemon und speichert das Image in containers/storage
, und führen Sie dann den Container aus. Es verwendet den Docker-Speicher nicht direkt. Damit Podman mit Docker kommunizieren kann, müssen wir es als Root ausführen, da der Docker-Daemon Root-Rechte benötigt.
$ sudo docker pull fedora
$ sudo podman run docker-daemon:docker.io/library/fedora echo hello
Wenn Sie ein Image über buildah
erstellen , können Sie das Image direkt in den docker-daemon
übertragen :
# ctr=$(buildah from fedora)
# mnt=$(buildah mount $ctr)
# install -m 0744 start.sh $/mnt
# buildah commit $ctr docker-damon:myimage
Hinweis :Obwohl es cool ist, den docker-daemon
zu verwenden Bei einem solchen Transport ist dies ein letzter Ausweg mit sehr hohen E/A- und Speicherkosten. Konsolidierung des Prozesses zur Ausführung in dem einen oder anderen storage/ecosystem
ist fast immer besser. Zum Beispiel wäre es besser, das Image aus dem Docker-Daemon zu ziehen und dann einfach containers/storage
zu verwenden für die Ausführung.
$ sudo podman pull docker-daemon:registry.fedoraproject.org/library/fedora
$ podman run fedora echo hello
Container-Lagerung
Der abschließende "Transport" ist wirklich überhaupt kein Transport, sondern eher ein Mechanismus zum Speichern eines Bildes in einem lokalen Speicher, der mit containers/storage
erstellt wurde Bücherei. Das Format von docker-reference
wird ausführlich im Docker-Transport beschrieben.
$ skopeo copy docker://registry.access.redhat.com/ubi8:latest containers-storage:ubi8:latest
Buildah und Podman speichern ihre Bilder standardmäßig im Containerspeicher:
$ podman image pull ubi8
Der obige Podman-Befehl erweitert Kurznamen für ubi8 zu registry.access.redhat.com/ubi8:latest
und verwendet dann den docker:// transport
um es von registry.access.redhat.com
zu ziehen . Anschließend speichert es den Inhalt direkt in containers/storage
.
$ buildah push docker://quay.io/myrepo/myimage
Der obige Buildah-Befehl schaut in den Containerspeicher und pusht dann das Bild mit docker://
Transport zur quay.io-Registrierung.
[ Erste Schritte mit Containern? Schauen Sie sich diesen kostenlosen Kurs an. Containerisierte Anwendungen bereitstellen:Eine technische Übersicht. ]
Schlussfolgerung
Die containers/image
Die Bibliothek bietet eine hervorragende Möglichkeit, Container-Images zwischen Computern und verschiedenen Speicherarten zu übertragen. Es ist ein integraler Bestandteil der Container-Engines und bietet einige wirklich coole Funktionen. Bitte vertiefen Sie sich mit Hilfe der Manpage container-transports genauer in die Transporte.