Los manifiestos de Docker describen las capas dentro de una imagen. Un manifiesto permite la comparación exacta de dos imágenes, incluso si tienen diferentes etiquetas asignadas.
Los manifiestos se expresan en JSON y contienen información sobre las capas y arquitecturas de la imagen. El cliente de Docker utiliza manifiestos para determinar si una imagen es compatible con el dispositivo actual. Luego usa la información para determinar cómo iniciar nuevos contenedores.
El Formato del Manifiesto
El esquema de manifiesto se encuentra actualmente en la versión 2. Un archivo completo declarará su versión de esquema y luego una lista de entradas de manifiesto disponibles para la imagen. Cada entrada representa una variante diferente de la imagen, como x86 y ARM64.
Puede ver el manifiesto de cualquier imagen usando docker manifest inspect
dominio. Esto funciona tanto con imágenes locales como con imágenes almacenadas en un registro remoto como Docker Hub.
docker manifest inspect my-image:latest
El manifiesto es una lista de capas incluidas en la imagen. Puede ver el hash del contenido de la capa y su tamaño total.
Si agrega el --verbose
bandera, obtendrá aún más información sobre la imagen. Esto incluye la etiqueta de la imagen (en el Ref
field), su arquitectura y su sistema operativo.
Docker no cargará detalles de manifiesto de registros inseguros de forma predeterminada. Si necesita utilizar un registro protegido incorrectamente, agregue el --insecure
marcar a su docker manifest
comandos.
Manifiestos y construcciones de múltiples arcos
Históricamente, Docker no admitía múltiples arquitecturas de imágenes. Las imágenes solo se pueden usar en máquinas con la misma arquitectura en la que se construyeron. Esto resultó rápidamente limitante ya que Docker encontró más uso en entornos de servidor y en máquinas más nuevas basadas en ARM.
Además de permitir la identificación única de imágenes, los manifiestos facilitan la creación de arquitecturas múltiples. Si inspecciona una imagen que admite varias arquitecturas, verá un resultado de manifiesto sutilmente diferente:
docker manifest inspect php:latest
Ejecutar el comando anterior mostrará el manifiesto de la imagen oficial de PHP Docker. Puede ver en la captura de pantalla que hay varias opciones de plataforma disponibles, incluidas AMD64 y ARM. Hemos truncado la lista completa que en realidad incluye ocho arquitecturas compatibles diferentes.
Los manifiestos permiten a los autores de imágenes anunciar la compatibilidad con varias arquitecturas bajo una etiqueta de imagen. El cliente de Docker selecciona la versión de imagen adecuada para su plataforma, según las opciones de la lista. Se espera que los autores solo agrupen imágenes que ofrezcan una funcionalidad idéntica; no debe haber cambios más allá de la arquitectura de destino o el sistema operativo.
Cada arquitectura en la lista se refiere a otra manifestar a través de su digest
campo. El manifiesto al que se hace referencia será un archivo normal de arquitectura única. Docker hace coincidir la plataforma actual con el manifiesto de arco único correcto y luego carga ese archivo para determinar la lista final de capas de imágenes.
Puede crear manualmente imágenes de varias arquitecturas utilizando el docker manifest
dominio. Cree cada una de las imágenes individuales y envíelas a un registro. Luego use docker manifest create
comando para combinar las imágenes en un nuevo manifiesto compartido bajo una sola etiqueta.
# on an AMD64 machine docker build -t my-image:amd64 . docker push my-image:amd64 # on an ARM machine docker build -t my-image:arm . docker push my-image:arm # now combine the manifests docker manifest create my-image:latest --amend my-image:x64 --amend my-image:arm docker manifest push my-image:latest
Usando manifest create
con el --amend
flag le permite fusionar varios manifiestos independientes. Luego, el manifiesto final se envía a Docker Hub con el latest
etiqueta. Los usuarios de AMD64 y ARM podrán crear contenedores a partir de esta imagen.
No es obligatorio ensamblar manualmente imágenes de múltiples arcos. Puedes usar el buildx
comando en su lugar para simplificar considerablemente el proceso.
docker buildx build --platform linux/amd64,linux/arm64/v8 --tag my-image:latest
Este único comando da como resultado una imagen que funciona en las plataformas AMD64 y ARM64. Debajo del capó, todavía está produciendo una lista de manifiesto de varias arquitecturas, por lo que es útil comprender el funcionamiento interno de cómo se vinculan las imágenes.
Anotación de manifiestos
Docker le permite anular manualmente los datos del manifiesto a través de anotaciones. Los campos admitidos incluyen información sobre la arquitectura y el sistema operativo.
Usa el docker manifest annotate
Comando para configurar anotaciones. Si está anotando una imagen de arquitectura única, proporcione una etiqueta de imagen que haga referencia a ella. Para las imágenes de múltiples arquitecturas, necesitará tanto la etiqueta de imagen general como la etiqueta del manifiesto individual dentro de la lista de manifiestos de múltiples arquitecturas.
docker manifest annotate my-image:latest my-image:amd64 --os-version linux
Este comando marca la versión AMD64 de my-image:latest
imagen como un contenedor basado en Linux.
Las anotaciones a menudo no necesitan configurarse a mano. Por lo general, se deducen automáticamente del entorno de compilación. Puedes usar el annotate
Comando para agregar campos faltantes o cambiar la configuración de la imagen en el futuro.
Resumen
Los manifiestos de Docker describen las capas de una imagen y las arquitecturas que admite. Un manifiesto puede ser una arquitectura única, que admita una plataforma específica, o una arquitectura múltiple. En este último caso, el archivo contiene una lista de referencias a los manifiestos de arco único que incorpora.
La interacción manual con los manifiestos debería ser rara, pero es posible con el docker manifest
grupo de mando. Ahora es más común automatizar compilaciones de varias arquitecturas a través de Buildx, que ofrece una experiencia simplificada de ensamblaje de manifiestos.