Soy nuevo en Docker y estoy tratando de entender exactamente qué es una imagen de Docker . Cada definición individual de una imagen de Docker utiliza el término "capa", pero no parece definir qué se entiende por capa .
De los documentos oficiales de Docker :
Ya hemos visto que las imágenes de Docker son plantillas de solo lectura desde las que se inician los contenedores de Docker. Cada imagen consta de una serie de capas. Docker utiliza sistemas de archivos de unión para combinar estas capas en una sola imagen. Los sistemas de archivos de unión permiten que los archivos y directorios de sistemas de archivos separados, conocidos como ramas, se superpongan de forma transparente, formando un único sistema de archivos coherente.
Entonces pregunto, ¿qué es una capa (exactamente); ¿Alguien puede dar algunos ejemplos concretos de ellos? ¿Y cómo se "juntan" estas capas para formar una imagen?
https://labs.ctl.io/caching-docker-images/
) está roto. ¿Alguien tiene sugerencias para un reemplazo?Se crea una imagen de contenedor de docker utilizando un dockerfile . Cada línea en un dockerfile creará una capa. Considere el siguiente ejemplo ficticio:
Esto creará una imagen final donde el número total de capas será X + 3
fuente
Tienen más sentido para mí con un ejemplo ...
Examinando capas de tu propia construcción con docker diff
Tomemos un ejemplo artificial Dockerfile:
Cada uno de esos
dd
comandos genera un archivo 1M en el disco. Vamos a construir la imagen con una bandera extra para guardar los contenedores temporales:En la salida, verá que cada uno de los comandos en ejecución ocurre en un contenedor temporal que ahora guardamos en lugar de eliminar automáticamente:
Si ejecuta una
docker diff
en cada uno de esos identificadores de contenedor, verá qué archivos se crearon en esos contenedores:Cada línea con un prefijo como
A
está agregando el archivo,C
indica un cambio en un archivo existente yD
indica una eliminación.Aquí está la parte TL; DR
Cada uno de estos sistemas de archivos de contenedor difiere arriba en una "capa" que se ensambla cuando ejecuta la imagen como contenedor. El archivo completo está en cada capa cuando hay un agregado o cambio, por lo que cada uno de esos
chmod
comandos, a pesar de solo cambiar un bit de permiso, hace que todo el archivo se copie en la siguiente capa. El archivo / data / one eliminado todavía está en las capas anteriores, de hecho 3 veces, y se copiará a través de la red y se almacenará en el disco cuando extraiga la imagen.Examinando imágenes existentes
Puede ver los comandos necesarios para crear las capas de una imagen existente con el
docker history
comando. También puede ejecutar unadocker image inspect
imagen y ver la lista de capas en la sección RootFS.Aquí está el historial de la imagen de arriba:
Las capas más nuevas se enumeran en la parte superior. Cabe destacar que hay dos capas en la parte inferior que son bastante antiguas. Vienen de la propia imagen de busybox. Cuando crea una imagen, hereda todas las capas de la imagen que especifica en la
FROM
línea. También se agregan capas para los cambios en los metadatos de la imagen, como laCMD
línea. Apenas ocupan espacio y son más para mantener registros de las configuraciones que se aplican a la imagen que está ejecutando.¿Por qué capas?
Las capas tienen un par de ventajas. Primero, son inmutables. Una vez creada, esa capa identificada por un hash sha256 nunca cambiará. Esa inmutabilidad permite que las imágenes se construyan y se separen de manera segura. Si dos dockerfiles tienen el mismo conjunto inicial de líneas y están construidos en el mismo servidor, compartirán el mismo conjunto de capas iniciales, ahorrando espacio en disco. Eso también significa que si reconstruye una imagen, con solo las últimas líneas del Dockerfile experimentando cambios, solo esas capas deben reconstruirse y el resto puede reutilizarse desde el caché de capas. Esto puede hacer que la reconstrucción de las imágenes de la ventana acoplable sea muy rápida.
Dentro de un contenedor, verá el sistema de archivos de imagen, pero ese sistema de archivos no se copia. Encima de esas capas de imágenes, el contenedor monta su propia capa de sistema de archivos de lectura y escritura. Cada lectura de un archivo pasa a través de las capas hasta que llega a una capa que ha marcado el archivo para su eliminación, tiene una copia del archivo en esa capa o la lectura se queda sin capas para buscar. Cada escritura hace una modificación en la capa de lectura-escritura específica del contenedor.
Reducción de la hinchazón de la capa
Una desventaja de las capas es crear imágenes que duplican archivos o envían archivos que se eliminan en una capa posterior. La solución a menudo es fusionar múltiples comandos en un solo
RUN
comando. Particularmente cuando está modificando archivos existentes o eliminando archivos, desea que esos pasos se ejecuten en el mismo comando donde se crearon por primera vez. Una reescritura del Dockerfile anterior se vería así:Y si compara las imágenes resultantes:
Simplemente fusionando algunas líneas en el ejemplo artificial, obtuvimos el mismo contenido resultante en nuestra imagen, y redujimos nuestra imagen de 5 MB al archivo de 1 MB que ves en la imagen final.
fuente
Desde Docker v1.10, con la introducción del contenido de almacenamiento direccionable, la noción de 'capa' se volvió bastante diferente. Las capas no tienen noción de una imagen o pertenecen a una imagen, se convierten en meras colecciones de archivos y directorios que se pueden compartir entre imágenes. Las capas y las imágenes se separaron.
Por ejemplo, en una imagen construida localmente a partir de una imagen base, digamos
ubuntu:14.04
, eldocker history
comando produce la cadena de imágenes, pero algunas de las ID de imágenes se mostrarán como 'perdidas' porque el historial de compilación ya no se carga. Y las capas que componen estas imágenes se pueden encontrar a través deEl contenido de la capa se almacena
/var/lib/docker/aufs/diff
si la selección del controlador de almacenamiento esaufs
. Pero las capas se nombran con una ID de caché generada aleatoriamente, parece que el enlace entre una capa y su ID de caché solo es conocido por Docker Engine por razones de seguridad. Todavía estoy buscando una manera de descubrirEste blog proporcionó mucha información.
fuente
Según las especificaciones de imagen de Docker a través de The Moby Project :
Entonces, esencialmente, una capa es solo un conjunto de cambios realizados en el sistema de archivos.
fuente
"Each [Docker] layer is a set of filesystem changes."
(Suponiendo que esto sea cierto). Por alguna razón, no entendí este punto fundamental al leer muchos otros documentos / blogs / Q + A's / etc, y sospecho que la limitación era de ellos y no mía. De todos modos, bravo Aditya por llegar al meollo del asunto.Creo que el documento oficial ofrece una explicación bastante detallada: https://docs.docker.com/engine/userguide/storagedriver/imagesandcontainers/ .
(fuente: docker.com )
Una imagen consta de muchas capas que generalmente se generan a partir de Dockerfile, cada línea en Dockerfile creará una nueva capa, y el resultado es una imagen, que se denota por el formulario
repo:tag
, comoubuntu:15.04
.Para obtener más información, considere leer los documentos oficiales anteriores.
fuente
Gracias @David Castillo por la información útil . Creo que la capa es un cambio binario o una instrucción de una imagen que se puede hacer o deshacer fácilmente. Se hacen paso a paso, lo mismo que una capa en una capa, por lo que llamamos "capa".
Para obtener más información, puede ver el "historial del acoplador" de esta manera:
fuente
Mi comprensión personal es que podemos comparar la capa de Docker con Github commit. Para su imagen base (su nuevo repositorio principal), realiza varias confirmaciones, cada confirmación está cambiando su estado maestro, es lo mismo en el acoplador, cada capa está realizando algunas operaciones basadas en la capa intermedia anterior. Y luego, esta capa se convierte en una nueva capa intermedia para la siguiente capa.
fuente
Solía pensar que son como diferencias en las capas anteriores. Después de leer algunas de las respuestas aquí, no estaba tan seguro; se describen como conjuntos de cambios en el sistema de archivos . He escrito algunos Dockerfiles para mostrar que son más como diffs, es decir, realmente dependen de capas anteriores.
Dados estos dos Dockerfiles
y
uno esperaría el mismo conjunto de capas si solo se tratara de cambios en el sistema de archivos, pero este no es el caso:
y
Puede ver cómo, incluso si los cambios en el sistema de archivos son los mismos en ambos casos, el orden es importante.
fuente