Quelle est la différence entre enregistrer et exporter dans Docker?

157

Je joue avec Docker depuis quelques jours et j'ai déjà fait des images (ce qui était vraiment amusant!). Maintenant, je veux persister dans mon travail et suis arrivé aux commandes saveet export, mais je ne les comprends pas complètement.

Quelle est la différence entre saveet exportdans Docker?

Thomas Uhrig
la source
4
J'ai également écrit un article de blog à ce sujet sur tuhrig.de/difference-between-save-and-export-in-docker
Thomas Uhrig

Réponses:

169

La réponse courte est:

  • saveva chercher une image: pour une VM ou un serveur physique, ce serait l'image ou le disque .ISO d'installation. Le système d'exploitation de base.

    Il emballera les couches et les métadonnées de toute la chaîne requise pour construire l'image. Vous pouvez ensuite charger cette chaîne d'images "enregistrées" dans une autre instance de docker et créer des conteneurs à partir de ces images.

  • exportrécupérera tout le conteneur: comme un instantané d'une VM ordinaire. Enregistre le système d'exploitation bien sûr, mais aussi toute modification que vous avez apportée, tout fichier de données écrit pendant la vie du conteneur. Celui-ci ressemble plus à une sauvegarde traditionnelle.

    Il vous donnera une archive plate .tar contenant le système de fichiers de votre conteneur.

Edit: comme mon explication peut encore prêter à confusion, je pense qu'il est important de comprendre que l'une de ces commandes fonctionne avec des conteneurs, tandis que l'autre fonctionne avec des images.

  • Une image doit être considérée comme «morte» ou immuable, en commençant par 0 ou 1000 conteneurs ne modifiera pas un seul octet. C'est pourquoi j'ai fait une comparaison avec une ISO d'installation système plus tôt. C'est peut-être encore plus proche d'un live-CD.

  • Un conteneur «démarre» l'image et ajoute une couche supplémentaire par-dessus. Cette couche stocke tout changement sur le conteneur (fichiers créés / modifiés / supprimés ...).

mbarthelemy
la source
2
Juste pour ma clarification: supposons que j'ai un conteneur en cours d'exécution dans lequel j'ai effectué des modifications (par exemple, j'ai créé un nouveau dossier). Maintenant, je peux faire une image de ce conteneur (avec docker commit). Je peux alors savel'image. Ou je peux exportle conteneur directement. Et les deux manières ( savel'image et exportle conteneur) auront le même résultat?
Thomas Uhrig
2
Oui et non. Le exportvous donnera une archive plate .tar contenant votre système de fichiers conteneur. saveemballera les couches et les métadonnées de toute la chaîne nécessaire pour construire l'image. Vous pouvez ensuite charger cette savedchaîne d'images " " dans une autre instance de docker et créer des conteneurs à partir de ces images.
mbarthelemy
7
@ThomasUhrig Vous pouvez utiliser l'exportation pour "aplatir" le conteneur en une couche / image de base. Vous pouvez également l'utiliser pour sauvegarder le conteneur (par exemple, le conteneur de données). Mais cela peut aussi être fait sans exportfonction.
Jiri
9
De plus, exporttoutes les métadonnées seront perdues, donc au cas où vous tenteriez d'exécuter le conteneur avec cette image, vous aurez à réitérer le CMD et d'autres métdonnées. savea bien fonctionné pour moi mais l'exportation a été pénible
Mirage
1
Je souhaite mettre à jour mon image avec la dernière version. Le conteneur en cours d'exécution a apporté des modifications au système de fichiers interne. Après la mise à niveau, je souhaite que ces modifications soient restaurées. Si je comprends bien, la sauvegarde / chargement et l'exportation / importation créeront une nouvelle image pour moi, ce qui n'est pas ce que je veux. Je souhaite utiliser une nouvelle version de l'image de dockerhub, mais restaurer les données du conteneur existant. Quel est le meilleur plan d'action?
Dmitry z
20

Il existe deux différences principales entre les commandes saveet export.

  1. saveLa commande enregistre l'image entière avec l'historique et les métadonnées, mais la exportcommande n'exporte que la structure des fichiers (sans historique ni métadonnées). Ainsi, le fichier tar exporté sera plus petit que celui enregistré.

  2. Lorsque vous utilisez le système de fichiers exporté pour créer une nouvelle image , puis cette nouvelle image ne contient aucune USER, EXPOSE, RUNetc. commandes de votre Dockerfile. Seule la structure des fichiers sera transférée. Ainsi, lorsque vous utilisez des mots-clés mentionnés dans votre Dockerfile, vous ne pouvez pas utiliser la commande d'exportation pour transférer l'image vers une autre machine - vous devez toujours utiliser la commande save.

eNca
la source
4

L'image exportée n'aura aucune information de calque ou d'historique enregistrée, elle sera donc plus petite et vous ne pourrez pas revenir en arrière.

L'image enregistrée aura des informations de calque et d'historique, donc plus grandes.

Si vous donnez ceci à un client, la question est de savoir si vous souhaitez conserver ces couches ou non?

Neil McGill
la source
donc, une exportation est similaire à un fichier txt sans rien d'écrit, non ?? @neil
AATHITH RAJENDRAN
4
c'est comme un fichier texte sans tampon d'annulation 8)
Neil McGill
2

Techniquement, enregistrer / charger fonctionne avec des référentiels qui peuvent être une ou plusieurs images, également appelées couches. Une image est un seul calque dans un dépôt. Enfin, un conteneur est une image instanciée (en cours d'exécution ou non).

Fatherlinux
la source
1

Docker save Produit un référentiel de fichiers tar qui contient toutes les couches parentes, et toutes les balises + versions, ou repo spécifié: balise, pour chaque argument fourni à partir de l' image .

Export Docker Produit un fichier spécifié (peut être tar ou tgz) avec un contenu plat sans contenu des volumes spécifiés à partir de Container .

docker save doit être utilisé sur l'image docker lors de l' exportation de docker doit être utilisé sur le conteneur (tout comme l'image en cours d'exécution)

Enregistrer l'utilisation

docker enregistrer [OPTIONS] IMAGE [IMAGE ...]

Enregistrer une ou plusieurs images dans une archive tar (diffusée sur STDOUT par défaut)

--help = false Utilisation de l'impression -o, --output = "" Ecrire dans un fichier, au lieu de STDOUT

Utilisation d'exportation

exportation de docker [OPTIONS] CONTAINER

Exporter le contenu du système de fichiers d'un conteneur sous forme d'archive tar

--help = false Utilisation de l'impression -o, --output = "" Ecrire dans un fichier, au lieu de STDOUT

Sachin Gade
la source
1
La question concerne la différence entre deux commandes et non la définition et l'utilisation généralisées!
Abu Shumon
0

export: container (filesystem)-> image tar.
import: exported image tar->image . Une seule couche.

save: image-> image tar.
load: saved image tar-> image. Toutes les couches seront récupérées.

De Docker in Action, deuxième édition p190.

Les images en couches conservent l'historique de l'image, les métadonnées de création de conteneur et les anciens fichiers qui peuvent avoir été supprimés ou remplacés.

Les images aplaties contiennent uniquement l'ensemble actuel de fichiers sur le système de fichiers.

youngsend
la source