В чем разница между сохранением и экспортом в Docker?

157

Я играю с пару дней Docker, и я уже сделал несколько снимков (это было действительно весело!). Теперь я хочу , чтобы упорствовать свою работу и пришел к saveи exportкомандам, но я не полностью понять их.

В чем разница между saveи exportв Docker?

Томас Уриг
источник
4
Я также написал сообщение в блоге об этом в tuhrig.de/difference-between-save-and-export-in-docker
Thomas Uhrig

Ответы:

169

Краткий ответ:

  • saveизвлечет образ: для виртуальной машины или физического сервера это будет установочный образ .ISO или диск. Базовая операционная система.

    Он упакует слои и метаданные всей цепочки, необходимой для построения изображения. Затем вы можете загрузить эту цепочку «сохраненных» изображений в другой экземпляр докера и создать контейнеры из этих изображений.

  • exportполучит весь контейнер: как снимок обычной виртуальной машины. Конечно, сохраняет ОС, а также любые сделанные вами изменения, любые файлы данных, записанные в течение срока службы контейнера. Этот больше похож на традиционную резервную копию.

    Это даст вам плоский архив .tar, содержащий файловую систему вашего контейнера.

Изменить: так как мое объяснение все еще может привести к путанице, я думаю, что важно понимать, что одна из этих команд работает с контейнерами, а другая работает с изображениями.

  • Изображение должно рассматриваться как «мертвый» или неизменны, начиная 0 или 1000 контейнеров из него не будет изменять один байт. Вот почему я сделал сравнение с системой установки ISO ранее. Возможно, это даже ближе к live-CD.

  • Контейнер «сапоги» изображение и добавляет дополнительный слой поверх него. Этот слой хранит любые изменения в контейнере (созданные / измененные / удаленные файлы ...).

mbarthelemy
источник
2
Просто для пояснения: предположим, у меня есть работающий контейнер, в который я внес некоторые изменения (например, я создал новую папку). Теперь я могу сделать изображение этого контейнера (с docker commit). Я могу тогда saveизображение. Или я могу exportконтейнер напрямую. И оба пути ( saveизображение и exportконтейнер) будут иметь одинаковый результат?
Томас Уриг
2
Да и нет. Это exportдаст вам плоский архив .tar, содержащий вашу файловую систему контейнера. saveупакует слои и метаданные всей цепочки, необходимой для построения изображения. Затем вы можете загрузить эту " saved" цепочку изображений в другой экземпляр докера и создать контейнеры из этих изображений.
Мбартелеми
7
@ThomasUhrig Вы можете использовать экспорт, чтобы «сплющить» контейнер в один слой / базовое изображение. Также вы можете использовать его для резервного копирования контейнера (например, контейнер данных). Но это можно сделать и без exportфункции.
Иржи
9
Кроме того, exportвсе метаданные будут потеряны, поэтому в случае, если вы попытаетесь запустить контейнер с этим изображением, вы повторно вызовете CMD и другие метаданные. saveработал хорошо для меня, но экспорт был боль
Мираж
1
Я хочу обновить свое изображение до последней версии. Контейнер, который работает сейчас, внес некоторые изменения во внутреннюю файловую систему. После обновления я хочу, чтобы эти изменения были восстановлены. Как я понимаю, и сохранение / загрузка, и экспорт / импорт создадут для меня новый образ, а это не то, что я хочу. Я хочу использовать новую версию образа из dockerhub, но восстановить данные из существующего контейнера. Какой лучший курс действий?
Дмитрий z
20

Существуют две основные различия между saveи exportкоманд.

  1. saveКоманда сохраняет все изображение с историей и метаданными, но exportкоманда экспортирует только структуру файлов (без истории и метаданных). Таким образом, экспортированный файл tar будет меньше сохраненного.

  2. При использовании экспортированной файловой системы для создания нового образа , то этот новый образ не будет содержать какие - либо USER, EXPOSE, и RUNт.д. команды из вашего Dockerfile. Будет передана только структура файла. Поэтому, когда вы используете упомянутые ключевые слова в вашем Dockerfile, вы не можете использовать команду экспорта для передачи изображения на другой компьютер - вам всегда нужно использовать команду save.

ENCA
источник
4

На экспортированном изображении не будет сохранено никакой информации о слое или истории, поэтому оно будет меньше и вы не сможете выполнить откат.

Сохраненное изображение будет иметь информацию о слое и истории, поэтому оно будет больше.

Если вы даете это клиенту, вопрос в том, хотите ли вы сохранить эти слои или нет?

Нил МакГилл
источник
Итак, экспорт похож на текстовый файл, на котором ничего не написано, верно? @neil
АЭФИТ РАДЖЕНДРАН
4
это как текстовый файл без буфера отмены 8)
Нил МакГилл
2

Технически, сохранение / загрузка работает с репозиториями, которые могут быть одним или несколькими изображениями, также называемыми слоями. Изображение представляет собой один слой в репо. Наконец, контейнер - это созданное изображение (работает или нет).

fatherlinux
источник
1

Сохранение Docker Создает репозиторий tar-файла, который содержит все родительские слои и все теги + версии или указанный тег repo: для каждого аргумента, представленного на изображении. .

Экспорт из Docker Создает указанный файл (может быть tar или tgz) с плоским содержимым без содержимого указанных томов из контейнера. .

Сохранение Docker необходимо использовать в образе Docker, в то время как экспорт Docker необходимо использовать в контейнере (так же, как запущенный образ)

Сохранить использование

Окно сохранения [ОПЦИИ] ИЗОБРАЖЕНИЕ [ИЗОБРАЖЕНИЕ ...]

Сохраните изображение (я) в архив tar (по умолчанию передается в STDOUT)

--help = false Использование печати -o, --output = "" Запись в файл вместо STDOUT

Использование экспорта

Экспорт докера [ОПЦИИ] КОНТЕЙНЕР

Экспорт содержимого файловой системы контейнера в виде архива tar

--help = false Использование печати -o, --output = "" Запись в файл вместо STDOUT

Сачин Гаде
источник
1
Вопрос о разнице между двумя командами, а не об обобщенном определении и использовании!
Абу Шумон
0

export: container (filesystem)-> image tar.
import: exported image tar-> image. Только один слой.

save: image-> image tar.
load: saved image tar->image . Все слои будут восстановлены.

Из Докера в действии, второе издание, стр. 190.

Многослойные изображения хранят историю изображения, метаданные создания контейнера и старые файлы, которые могли быть удалены или переопределены.

Сглаженные изображения содержат только текущий набор файлов в файловой системе.

youngsend
источник