Una cosa interesante sobre el uso de herramientas de contenedores como Podman, Buildah, CRI-O y Skopeo es que se basan en la misma biblioteca para extraer y enviar imágenes, que es contenedores/imagen. A menudo describo los containers/image
proyecto como una biblioteca para copiar imágenes entre diferentes tipos de contenedores de almacenamiento. Este almacenamiento puede estar en un registro de contenedores, en contenedores/almacenamiento, como objetos del sistema de archivos como directorios o tarballs, e incluso directamente en el demonio Docker. El mecanismo para mover estas imágenes de contenedores entre los diferentes tipos de almacenamiento de contenedores se denomina transporte. . Una de las características menos entendidas de containers/image
son los diversos transportes que soporta.
Transportes
La imagen se especifica usando un transport:ImageName formato. Si no se especifica ningún transporte, docker
El transporte (registro de contenedores) se utiliza de forma predeterminada en todas las herramientas que no sean Skopeo. Skopeo requiere que los usuarios configuren siempre el transporte.
Una de las cosas geniales que hizo Docker fue inventar la idea de un registro de contenedores , que es básicamente un servidor web que contiene imágenes de contenedor. Docker.io, quay.io y Artifactory son ejemplos de registros de contenedores. El equipo de ingeniería de Docker definió un protocolo para extraer y enviar estas imágenes desde los registros de contenedores, a lo que nos referimos como docker
. transporte.
[ También te puede interesar: 12 guías de Podman para empezar con los contenedores ]
docker://referencia-docker
Una referencia de imagen se almacena en un registro de imagen de contenedor remoto. Ejemplo:quay.io/podman/stable:latest
. La referencia puede incluir un nombre de host para un registro específico.
$ skopeo copy docker://docker.io/alpine dir:/tmp/alpine
$ podman run docker://registry.fedoraproject.org/fedora:latest echo hello
Para Podman y Buildah, docker:// transport
es el transporte predeterminado. Se puede dejar caer por conveniencia:
$ podman pull registry.fedoraproject.org/fedora:latest
Cuando se usa un nombre corto para extraer una imagen como fedora
, Podman y Buildah usan la lista de registros para crear una referencia de Docker y luego la llaman usando docker:// transport
transporte.
Containers/image
también es compatible con muchos otros transportes para copiar y almacenar imágenes de contenedores.
oci:ruta
El oci
transport exporta/importa el contenido de una imagen de contenedor a un directorio local, asumiendo que la imagen cumple con la especificación de diseño de imagen de contenedor abierto. Los tarballs del manifiesto y de la capa se exportan al directorio como archivos individuales.
$ skopeo copy oci:/tmp/myimage docker://registry.example.com/myimage
$ podman run oci:/tmp/fedora echo hello
directorio
El dir
transport vuelca el contenido de una imagen de contenedor en un directorio local, suponiendo nuevamente que la imagen cumple con el diseño de imagen de Docker. El manifiesto, los tarballs de capa y las firmas se exportan como archivos individuales al directorio. Este es un formato no estandarizado, principalmente útil para la depuración o inspección no invasiva de contenedores. Es muy similar al oci
transport pero almacena los archivos usando el formato docker heredado.
$ podman save --format docker-dir fedora -o /tmp/fedora
$ podman run dir:/tmp/fedora echo hello
docker-archivo
Otra forma que desarrollaron los ingenieros de Docker para almacenar y transportar imágenes de contenedores es usar tar
. Una bola de alquitrán contiene todos los archivos que componen una imagen de contenedor. Estos tarballs se crearon originalmente usando docker save
y podman save
comandos Podrían volver a cargarse en el almacenamiento local del motor del contenedor usando docker load
y podman load
. El container/image
La biblioteca convierte este formato de archivo en un transporte, lo que permite que otros comandos lo usen directamente como 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
Advertencia :Uso de docker-archive
casi nunca es lo correcto. El formato es muy derrochador tanto para almacenamiento como para E/S. Recomendaría que los usuarios ejecuten una docker/distribution
temporal registro en su lugar.
archivo-oci
Este formato es similar al docker-archive
, pero en lugar de ser el formato heredado, almacenará una sola imagen en formato OCI. La ruta es una imagen que cumple con la especificación de diseño de imagen de contenedor abierto en un directorio en la ruta especificada y está etiquetada con una etiqueta.
$ 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
Una de las mejores características de containers/image
es soporte para docker-daemon
transporte. Docker y Podman no comparten el mismo almacenamiento. No pueden porque Docker controla el bloqueo de su almacenamiento dentro del daemon. Si bien Podman, Buildah, CRI-O y Skopeo pueden compartir contenido, usan el sistema de archivos a través de containers/storage
. .
Podman y las demás herramientas pueden funcionar con docker-daemon
almacenamiento indirectamente, a través de docker-daemon
transporte. Esto permite que los motores de contenedores accedan directamente a imágenes extraídas previamente por el demonio Docker o imágenes creadas por docker build
. También puede mover imágenes creadas por Buildah y Podman directamente al demonio Docker.
Algo como esto:
podman run docker-daemon:alpine echo hello
Nota :Podman está extrayendo la imagen del demonio Docker, almacenando la imagen en containers/storage
y luego ejecutar el contenedor. No está utilizando el almacenamiento de Docker directamente. Para permitir que Podman se comunique con Docker, debemos ejecutarlo como root, ya que el demonio de Docker requiere privilegios de root.
$ sudo docker pull fedora
$ sudo podman run docker-daemon:docker.io/library/fedora echo hello
Si construye una imagen a través de buildah
, puede confirmar la imagen directamente en el docker-daemon
:
# ctr=$(buildah from fedora)
# mnt=$(buildah mount $ctr)
# install -m 0744 start.sh $/mnt
# buildah commit $ctr docker-damon:myimage
Nota :Si bien es genial usar el docker-daemon
transporte como este, es una función de último recurso con costos de E/S y almacenamiento muy grandes. Consolidar el proceso para que se ejecute en uno u otro storage/ecosystem
casi siempre es mejor. Por ejemplo, sería mejor sacar la imagen del demonio Docker y luego usar containers/storage
por ejecutarlo.
$ sudo podman pull docker-daemon:registry.fedoraproject.org/library/fedora
$ podman run fedora echo hello
contenedores-almacenamiento
El "transporte" final en realidad no es un transporte en absoluto, sino más bien un mecanismo para almacenar una imagen en un almacenamiento local creado usando containers/storage
biblioteca. El formato de docker-reference
se describe en detalle en el transporte de Docker.
$ skopeo copy docker://registry.access.redhat.com/ubi8:latest containers-storage:ubi8:latest
Por defecto, Buildah y Podman almacenan sus imágenes en contenedores:
$ podman image pull ubi8
El comando Podman anterior expande los nombres cortos para ubi8 a registry.access.redhat.com/ubi8:latest
y luego usa el transporte docker:// transport
para extraerlo de registry.access.redhat.com
. Luego almacena el contenido directamente en containers/storage
.
$ buildah push docker://quay.io/myrepo/myimage
El comando Buildah anterior busca en el almacenamiento del contenedor y luego empuja la imagen usando docker:// transport
transporte al registro quay.io.
[ ¿Empezando con los contenedores? Consulta este curso gratuito. Implementación de aplicaciones en contenedores:una descripción técnica general. ]
Conclusión
Los containers/image
biblioteca proporciona una excelente manera de transferir imágenes de contenedores entre máquinas y diferentes tipos de almacenamiento. Es parte integral de los motores de contenedores y proporciona algunas funciones realmente interesantes. Profundice más en los transportes utilizando la página del manual de transporte de contenedores.