Un aspetto interessante dell'utilizzo di strumenti contenitore come Podman, Buildah, CRI-O e Skopeo è che si basano sulla stessa libreria per estrarre e spingere le immagini, ovvero contenitori/immagine. Descrivo spesso i containers/image
progetto come libreria per la copia di immagini tra diversi tipi di storage container. Questo spazio di archiviazione può trovarsi in un registro di container, in container/storage, come oggetti del file system come directory o tarball e persino direttamente nel daemon Docker. Il meccanismo per spostare queste immagini container tra i diversi tipi di storage container è chiamato trasporto . Una delle caratteristiche meno conosciute di containers/image
sono i vari trasporti che supporta.
Trasporti
L'immagine viene specificata utilizzando un transport:ImageName formato. Se non viene specificato alcun trasporto, il docker
(Registro contenitori) il trasporto viene utilizzato per impostazione predefinita in tutti gli strumenti diversi da Skopeo. Skopeo richiede agli utenti di impostare sempre il trasporto.
Una delle cose interessanti che Docker ha fatto è stata inventare l'idea di un registro di contenitori , che è fondamentalmente un server Web che contiene immagini di container. Docker.io, quay.io e Artifactory sono tutti esempi di registri di container. Il team di ingegneri di Docker ha definito un protocollo per estrarre e inviare queste immagini dai registri dei container, che chiamiamo docker
trasporto.
[ Potrebbero interessarti anche: 12 guide Podman per iniziare con i container ]
docker://riferimento-docker
Un riferimento a un'immagine viene archiviato in un registro di immagini del contenitore remoto. Esempio:quay.io/podman/stable:latest
. Il riferimento può includere un nome host in un registro specifico.
$ skopeo copy docker://docker.io/alpine dir:/tmp/alpine
$ podman run docker://registry.fedoraproject.org/fedora:latest echo hello
Per Podman e Buildah, docker://
è il trasporto predefinito. Può essere lasciato cadere per comodità:
$ podman pull registry.fedoraproject.org/fedora:latest
Quando si utilizza un nome breve per estrarre un'immagine come fedora
, Podman e Buildah utilizzano l'elenco dei registri per creare un riferimento Docker e quindi lo chiamano utilizzando il docker://
trasporto.
Containers/image
supporta anche molti altri trasporti per la copia e la memorizzazione di immagini contenitore.
oci:percorso
Il oci
transport esporta/importa il contenuto di un'immagine del contenitore in una directory locale, presupponendo che l'immagine sia conforme alla specifica del layout dell'immagine del contenitore aperto. I tarball manifest e layer vengono esportati nella directory come file singoli.
$ skopeo copy oci:/tmp/myimage docker://registry.example.com/myimage
$ podman run oci:/tmp/fedora echo hello
dir
La dir
transport esegue il dump del contenuto di un'immagine del contenitore in una directory locale, sempre supponendo che l'immagine sia conforme al layout dell'immagine Docker. Il manifest, i tarball di livello e le firme vengono esportati come singoli file nella directory. Questo è un formato non standardizzato, utile principalmente per il debug o l'ispezione non invasiva dei contenitori. È molto simile a oci
trasporto ma archivia i file utilizzando il formato Docker legacy.
$ podman save --format docker-dir fedora -o /tmp/fedora
$ podman run dir:/tmp/fedora echo hello
archivio mobile
Un altro modo che gli ingegneri Docker hanno sviluppato per archiviare e trasportare le immagini dei container in giro è l'utilizzo di tar
. Un tarball contiene tutti i file che compongono un'immagine contenitore. Questi tarball sono stati originariamente creati utilizzando il docker save
e podman save
comandi. Potrebbero essere ricaricati nella memoria locale del motore del contenitore utilizzando docker load
e podman load
. Il container/image
library trasforma questo formato di archivio in un trasporto, consentendo di utilizzarlo direttamente da altri comandi come podman run dir:/tmp/fedora.tag echo hello
o 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
Avviso :Utilizzo di docker-archive
non è quasi mai la cosa giusta da fare. Il formato è molto dispendioso sia per l'archiviazione che per l'I/O. Consiglierei agli utenti di eseguire una docker/distribution
temporanea registro invece.
oci-archivio
Questo formato è simile a docker-archive
, ma invece di essere il formato legacy, memorizzerà una singola immagine in formato OCI. Il percorso è un'immagine conforme alla specifica Open Container Image Layout in una directory nel percorso specificato ed etichettata con un tag.
$ skopeo copy docker-archive:/tmp/fedora.img oci-archive:/tmp/fedora-oci.img
$ podman run oci-archive:/tmp/fedora-oci.img echo hello
demone mobile
Una delle funzionalità più interessanti di containers/image
è il supporto per il docker-daemon
trasporto. Docker e Podman non condividono lo stesso spazio di archiviazione. Non possono perché Docker controlla il blocco della sua memoria all'interno del demone. Sebbene Podman, Buildah, CRI-O e Skopeo possano condividere contenuti, utilizzano il file system tramite containers/storage
.
Podman e gli altri strumenti possono funzionare con il docker-daemon
archiviazione indirettamente, tramite il docker-daemon
trasporto. Ciò consente ai motori del contenitore di accedere direttamente alle immagini precedentemente estratte dal demone Docker o alle immagini create da docker build
. Puoi anche spostare le immagini create da Buildah e Podman direttamente nel demone Docker.
Qualcosa del genere:
podman run docker-daemon:alpine echo hello
Nota :Podman sta estraendo l'immagine dal demone Docker, salvandola in containers/storage
, quindi eseguire il contenitore. Non utilizza direttamente la memoria Docker. Per consentire a Podman di comunicare con Docker, dobbiamo eseguirlo come root poiché il demone Docker richiede i privilegi di root.
$ sudo docker pull fedora
$ sudo podman run docker-daemon:docker.io/library/fedora echo hello
Se crei un'immagine tramite buildah
, puoi salvare l'immagine direttamente nel docker-daemon
:
# ctr=$(buildah from fedora)
# mnt=$(buildah mount $ctr)
# install -m 0744 start.sh $/mnt
# buildah commit $ctr docker-damon:myimage
Nota :Anche se è bello usare il docker-daemon
trasporto come questo, è una caratteristica di ultima istanza con costi di I/O e storage molto elevati. Consolidamento del processo da eseguire nell'uno o nell'altro storage/ecosystem
è quasi sempre meglio. Ad esempio, sarebbe meglio estrarre l'immagine dal demone Docker e quindi utilizzare semplicemente containers/storage
per eseguirlo.
$ sudo podman pull docker-daemon:registry.fedoraproject.org/library/fedora
$ podman run fedora echo hello
contenitori-stoccaggio
Il "trasporto" finale in realtà non è affatto un trasporto, ma più un meccanismo per memorizzare un'immagine in un archivio locale creato usando i containers/storage
biblioteca. Il formato di docker-reference
è descritto in dettaglio nel trasporto Docker.
$ skopeo copy docker://registry.access.redhat.com/ubi8:latest containers-storage:ubi8:latest
Buildah e Podman per impostazione predefinita archiviano le loro immagini in un contenitore:
$ podman image pull ubi8
Il comando Podman sopra espande i nomi brevi per ubi8 a registry.access.redhat.com/ubi8:latest
e quindi utilizza il docker:// transport
per estrarlo da registry.access.redhat.com
. Quindi memorizza il contenuto direttamente in containers/storage
.
$ buildah push docker://quay.io/myrepo/myimage
Il comando Buildah sopra esamina lo spazio di archiviazione del contenitore e quindi esegue il push dell'immagine utilizzando il docker://
trasporto al registro di quay.io.
[ Iniziare con i container? Dai un'occhiata a questo corso gratuito. Distribuzione di applicazioni containerizzate:una panoramica tecnica. ]
Conclusione
I containers/image
La libreria fornisce un modo eccellente per trasferire le immagini del contenitore tra macchine e diversi tipi di archiviazione. È parte integrante dei motori dei container e fornisce alcune funzionalità davvero interessanti. Per favore approfondisci meglio i trasporti usando la pagina man di container-transports.