¿Cuál es la diferencia entre guardar y exportar en Docker?

157

Estoy jugando con Docker durante un par de días y ya hice algunas imágenes (¡lo cual fue muy divertido!). Ahora quiero persistir en mi trabajo y llegué a los comandos savey export, pero no los entiendo completamente.

¿Cuál es la diferencia entre savey exporten Docker?

Thomas Uhrig
fuente
44
También escribí una publicación de blog sobre esto en tuhrig.de/difference-between-save-and-export-in-docker
Thomas Uhrig

Respuestas:

169

La respuesta corta es:

  • savebuscará una imagen: para una máquina virtual o un servidor físico, esa sería la imagen o el disco de instalación .ISO. El sistema operativo base.

    Empaquetará las capas y metadatos de toda la cadena requerida para construir la imagen. Luego puede cargar esta cadena de imágenes "guardadas" en otra instancia de acoplador y crear contenedores a partir de estas imágenes.

  • exportbuscará todo el contenedor: como una instantánea de una VM normal. Guarda el sistema operativo, por supuesto, pero también cualquier cambio que haya realizado, cualquier archivo de datos escrito durante la vida útil del contenedor. Este es más como una copia de seguridad tradicional.

    Le dará un archivo .tar plano que contiene el sistema de archivos de su contenedor.

Editar: como mi explicación aún puede generar confusión, creo que es importante comprender que uno de estos comandos funciona con contenedores, mientras que el otro funciona con imágenes.

  • Una imagen debe ser considerada como 'muerta' o inmutable, comenzando 0 o 1000 contenedores desde ella no alterará un solo byte. Es por eso que hice una comparación con un sistema ISO de instalación anterior. Quizás esté aún más cerca de un CD en vivo.

  • Un contenedor "inicia" la imagen y agrega una capa adicional encima. Esta capa almacena cualquier cambio en el contenedor (archivos creados / modificados / eliminados ...).

mbarthelemy
fuente
2
Solo para mi aclaración: supongamos que tengo un contenedor en ejecución donde hice algunos cambios (por ejemplo, hice una nueva carpeta). Ahora puedo hacer una imagen de este contenedor (con docker commit). Entonces puedo savela imagen. O puedo exportel contenedor directamente. ¿Y ambas formas ( savela imagen y exportel contenedor) tendrán el mismo resultado?
Thomas Uhrig
2
Si y no. El exportle dará un archivo .tar plano que contiene su sistema de archivos contenedor. saveempacará las capas y metadatos de toda la cadena requerida para construir la imagen. Luego puede cargar esta " saved" cadena de imágenes en otra instancia de acoplador y crear contenedores a partir de estas imágenes.
mbarthelemy
77
@ThomasUhrig Puede usar exportar para "aplanar" el contenedor a una imagen de capa / base. También puede usarlo para hacer una copia de seguridad del contenedor (contenedor de datos de fe). Pero esto también se puede hacer sin exportfunción.
Jiri
9
Además, con exporttodos los metadatos se perderán, por lo que en caso de que intente ejecutar el contenedor con esa imagen, tendrá que mencionar el CMD y otros metadatos. savefuncionó bien para mí, pero exportar fue doloroso
Mirage
1
Quiero actualizar mi imagen a la última versión. El contenedor que se está ejecutando ahora ha realizado algunos cambios en el sistema de archivos interno. Después de la actualización, quiero restaurar estos cambios. Según tengo entendido, tanto guardar / cargar como exportar / importar crearán una nueva imagen para mí, que no es lo que quiero. Quiero usar una nueva versión de la imagen desde dockerhub, pero restaurar los datos del contenedor existente. ¿Cuál es el mejor curso de acción?
Dmitry z
20

Hay dos diferencias principales entre savey los exportcomandos.

  1. saveEl comando guarda la imagen completa con el historial y los metadatos, pero exportexporta solo la estructura de los archivos (sin historial ni metadatos). Por lo tanto, el archivo tar exportado será más pequeño que el guardado.

  2. Cuando se utiliza el sistema de archivos exportado para la creación de una nueva imagen a continuación, esta nueva imagen no contendrá ninguna USER, EXPOSE, RUNetc. comandos de su Dockerfile. Solo se transferirá la estructura del archivo. Entonces, cuando usa las palabras clave mencionadas en su Dockerfile, no puede usar el comando de exportación para transferir imágenes a otra máquina; siempre debe usar el comando guardar.

eNca
fuente
4

La imagen exportada no tendrá ninguna información de capa o historial guardada, por lo que será más pequeña y no podrá revertirla.

La imagen guardada voluntad información de capa e historial, por lo que es más grande.

Si le da esto a un cliente, la Q es ¿quiere mantener esas capas o no?

Neil McGill
fuente
entonces, ¿una exportación es similar a un archivo txt sin nada escrito correctamente? @neil
AATHITH RAJENDRAN
44
es como un archivo de texto sin búfer de deshacer 8)
Neil McGill
2

Técnicamente, guardar / cargar funciona con repositorios que pueden ser una o más imágenes, también conocidas como capas. Una imagen es una sola capa dentro de un repositorio. Finalmente, un contenedor es una imagen instanciada (en ejecución o no).

fatherlinux
fuente
1

Docker save Produce un repositorio de archivos tar que contiene todas las capas principales y todas las etiquetas + versiones, o repo especificado: tag, para cada argumento proporcionado por la imagen .

Exportación de Docker Produce un archivo especificado (puede ser tar o tgz) con contenido plano sin contenido de volúmenes especificados del Contenedor .

cargador de muelle Guardar necesidad de utilizar una imagen cargador de muelle mientras cargador de muelle de exportación necesidad de utilizar el recipiente (al igual que se ejecuta en la)

Guardar uso

docker save [OPCIONES] IMAGEN [IMAGEN ...]

Guardar una imagen (s) en un archivo tar (transmitido a STDOUT por defecto)

--help = false Uso de impresión -o, --output = "" Escribir en un archivo, en lugar de STDOUT

Uso de exportación

contenedor de exportación [OPCIONES] CONTENEDOR

Exportar el contenido del sistema de archivos de un contenedor como un archivo tar

--help = false Uso de impresión -o, --output = "" Escribir en un archivo, en lugar de STDOUT

Sachin Gade
fuente
1
¡La pregunta es sobre la diferencia entre dos comandos, no sobre la definición generalizada y el uso!
Abu Shumon
0

export: container (filesystem)-> image tar.
import: exported image tar-> image. Solo una capa.

save: image-> image tar.
load: saved image tar->image . Todas las capas serán recuperadas.

De Docker en acción, segunda edición p190.

Las imágenes en capas mantienen el historial de la imagen, los metadatos de creación de contenedores y los archivos antiguos que podrían haberse eliminado o anulado.

Las imágenes aplanadas contienen solo el conjunto actual de archivos en el sistema de archivos.

youngsend
fuente