Pensando en el sistema de archivos de unión de Docker, cualquier cambio se realizará en la imagen actual (la capa superior) y no en las anteriores; La pregunta es por qué Docker no destruye esas capas y simplemente las oculta. ¿Hay alguna razón específica para ello?
almacenamiento en caché
al guardar cada capa individualmente, la ventana acoplable puede almacenar en caché el resultado y reutilizarlo más tarde si no se invalida por ningún cambio anterior.
permite compilaciones más rápidas y un uso general más pequeño del sistema de archivos cuando se crean varias imágenes a partir de la misma imagen base
Docker se creó sobre AUFS, que es un sistema de archivos de unión.
Las imágenes se crean colocando cambios en capas uno encima del otro a través de AUFS (desde entonces se han agregado otros métodos)
Una compilación típica RUN algo que crea algunos datos y los guarda en una capa.
RUN touch a -- L1 a RUN touch b -- L2 b RUN touch c -- L3 cCada capa almacena solo su propio conjunto de cambios.
La suma de estas capas AUFS se monta una encima de cada una para convertirse en el sistema de archivos virtual subyacente para un contenedor. La "Imagen" es solo una vista de los datos en las capas subyacentes.
La imagen en sí no almacena ningún dato. Solo hace referencia a capas que almacenan datos.
*image view abc L3 c L2 b L1 aLos cambios de contenedor se realizan luego en una capa encima de todo esto. Copiar los datos existentes de la capa adecuada si es necesario modificarlos, agregar nuevos datos a su capa o "eliminar" datos que eliminan la referencia a los datos, no los datos reales en la capa subyacente.
Si tuviera que modificar un archivo, crear un archivo y eliminar un archivo
echo test >> a touch d rm cLas capas se verían así:
Lcontainer a * d L3 c L2 b L1 aSi tuviera que destruir una de las capas inferiores, a la vista que se presenta al contenedor le faltarían esos datos.
*image view ac L3 c L1 a Como menciona Derick Bailey, esto permite un almacenamiento en caché inteligente del tiempo de creación de imágenes que permite compartir capas entre imágenes, si se usa exactamente la misma capa nuevamente. Esto es normalmente cuando construyes FROM una imagen existente.
Los controladores de almacenamiento más nuevos, como decivemapper y zfs , implementan la misma estrategia, pero lo hacen a nivel de bloque con instantáneas o clones del sistema de archivos para cada capa. Los bloques de disco que no han cambiado desde una capa/instantánea subyacente se leerán desde la capa/instantánea original. La capa/instantánea del contenedor mantiene un puntero de regreso a los datos originales hasta que se cambia o elimina.