Qual é a diferença entre salvar e exportar no Docker?

157

Estou brincando com o Docker por alguns dias e já fiz algumas imagens (o que foi muito divertido!). Agora eu quero continuar meu trabalho e cheguei aos comandos savee export, mas não os entendo completamente.

Qual é a diferença entre savee exportno Docker?

Thomas Uhrig
fonte
4
Eu também escrevi um post sobre isso em tuhrig.de/difference-between-save-and-export-in-docker
Thomas Uhrig

Respostas:

169

A resposta curta é:

  • saveirá buscar uma imagem: para uma VM ou servidor físico, essa seria a imagem ou disco .ISO da instalação. O sistema operacional base.

    Ele compacta as camadas e os metadados de toda a cadeia necessária para criar a imagem. Você pode carregar essa cadeia de imagens "salvas" em outra instância do docker e criar contêineres a partir dessas imagens.

  • exportbuscará o contêiner inteiro: como um instantâneo de uma VM comum. Salva o sistema operacional, é claro, mas também qualquer alteração feita, qualquer arquivo de dados gravado durante a vida útil do contêiner. Este é mais como um backup tradicional.

    Ele fornecerá um arquivo .tar simples que contém o sistema de arquivos do seu contêiner.

Editar: como minha explicação ainda pode gerar confusão, acho importante entender que um desses comandos funciona com contêineres, enquanto o outro funciona com imagens.

  • Uma imagem deve ser considerada como 'inoperante' ou imutável, iniciar 0 ou 1000 contêineres a partir dela não alterará um único byte. Foi por isso que fiz uma comparação com uma ISO de instalação do sistema anteriormente. Talvez seja ainda mais perto de um CD ao vivo.

  • Um contêiner "inicializa" a imagem e adiciona uma camada adicional sobre ela. Essa camada armazena qualquer alteração no contêiner (arquivos criados / alterados / removidos ...).

mbarthelemy
fonte
2
Apenas para meu esclarecimento: Vamos supor que eu tenha um contêiner em execução onde fiz algumas alterações (por exemplo, criei uma nova pasta). Agora eu posso criar uma imagem desse container (com docker commit). Eu posso então savea imagem. Ou eu posso exporto recipiente diretamente. E os dois lados ( savea imagem e exporto contêiner) terão o mesmo resultado?
Thomas Uhrig 26/03
2
Sim e não. O exportarquivo lhe dará um arquivo .tar simples contendo seu sistema de arquivos do contêiner. saveempacotará as camadas e os metadados de toda a cadeia necessária para criar a imagem. Você pode carregar esta " saved" cadeia de imagens em outra instância do docker e criar contêineres a partir dessas imagens.
mbarthelemy
7
@ThomasUhrig Você pode usar a exportação para "achatar" o contêiner para uma imagem de camada / base. Além disso, você pode usá-lo para fazer backup do contêiner (fe data container). Mas isso também pode ser feito sem exportfunção.
Jiri
9
Além disso, com exporttodos os metadados serão perdidos, portanto, caso você tente executar o contêiner com essa imagem, você mencionará o CMD e outros metdados. savefuncionou bem para mim, mas de exportação foi dor
Mirage
1
Quero atualizar minha imagem para a versão mais recente. O contêiner que está sendo executado agora fez algumas alterações no sistema de arquivos interno. Após a atualização, desejo que essas alterações sejam restauradas. Pelo que entendi, salvar / carregar e exportar / importar criarão uma nova imagem para mim, que não é o que eu quero. Desejo usar uma nova versão da imagem do dockerhub, mas restaure os dados do contêiner existente. Qual é o melhor curso de ação?
Dmitry z
20

Existem duas principais diferenças entre savee exportcomandos.

  1. saveO comando salva a imagem inteira com histórico e metadados, mas exportexporta apenas a estrutura de arquivos (sem histórico e metadados). Portanto, o arquivo tar exportado será menor que o arquivo salvo.

  2. Quando você usa o sistema de arquivos exportado para a criação de uma nova imagem, então esta nova imagem não conterá qualquer USER, EXPOSE, RUNetc. comandos do seu Dockerfile. Somente a estrutura do arquivo será transferida. Portanto, quando você estiver usando as palavras-chave mencionadas no Dockerfile, não poderá usar o comando export para transferir imagens para outra máquina - sempre use o comando save.

eNca
fonte
4

A imagem exportada não terá nenhuma informação de camada ou histórico salva, portanto será menor e você não poderá reverter.

A imagem salva terá informações de camada e histórico, muito maiores.

Se você der isso a um cliente, o Q é: você deseja manter essas camadas ou não?

Neil McGill
fonte
então, uma exportação é semelhante a um arquivo txt sem nada escrito certo ?? @neil
AATHITH RAJENDRAN
4
é como um arquivo de texto sem desfazer tampão 8)
Neil McGill
2

Tecnicamente, salvar / carregar funciona com repositórios que podem ser uma ou mais imagens, também conhecidas como camadas. Uma imagem é uma única camada dentro de um repositório. Finalmente, um contêiner é uma imagem instanciada (em execução ou não).

fatherlinux
fonte
1

Docker save Produz um repositório de arquivos tar que contém todas as camadas pai e todas as tags + versões ou repositório especificado: tag, para cada argumento fornecido a partir da imagem .

Exportação do Docker Produz o arquivo especificado (pode ser tar ou tgz) com conteúdo plano, sem o conteúdo dos volumes especificados do Container .

o docker save precisa usar na imagem do docker, enquanto a exportação do docker precisa usar no contêiner (assim como a imagem em execução)

Salvar uso

janela de encaixe salvar [OPTIONS] IMAGE [IMAGE ...]

Salvar uma imagem em um arquivo tar (transmitido para STDOUT por padrão)

--help = false Uso da impressão -o, --output = "" Grava em um arquivo, em vez de STDOUT

uso de exportação

exportação de docker [OPTIONS] CONTAINER

Exportar o conteúdo do sistema de arquivos de um contêiner como um arquivo tar

--help = false Uso da impressão -o, --output = "" Grava em um arquivo, em vez de STDOUT

Sachin Gade
fonte
1
A pergunta é sobre a diferença entre dois comandos, não sobre definição e uso generalizados!
Abu Shumon
0

export: container (filesystem)-> image tar.
import: exported image tar-> image. Apenas uma camada.

save: image-> image tar.
load: saved image tar-> image. Todas as camadas serão recuperadas.

De Docker em ação, segunda edição, pág.

Imagens em camadas mantêm o histórico da imagem, os metadados de criação de contêiner e os arquivos antigos que podem ter sido excluídos ou substituídos.

Imagens achatadas contêm apenas o conjunto atual de arquivos no sistema de arquivos.

jovem
fonte