вторник, 27 июля 2021 г.

Команды docker save/load, docker export/import – в чем отличие, как и когда ими пользоваться

В этой статье я хочу рассказать про пары команды docker save/load и docker export/import, показать примеры их использования и рассказать чем они отличаются.

Да и как обычно, если тексту с картинками вы предпочитаете видео, то вот моя видео-инструкция на YouTube.



Команды docker save и docker load

Начнем с пары docker save/load. Эта пара команд работает с докер-имиджами. Команда docker save сохраняет имидж с локальной машины в tar-архив. Этот архив содержит всю необходимую информацию, чтобы потом восстановить докер-имидж. Восстановление докер-имиджа из tar-архива производится командой docker load. 

Теперь посмотрим на примере как это делается. У меня локально есть докер-имидж “alpine”. 

Чтобы сохранить его как tar-архив воспользуемся командой 

docker save alpine -o alpine-image.tar

Обратите внимание, на ключ  “-o“. Он позволяет указать имя файла, в который надо сохранить докер-имидж.

Теперь я удалю этот имидж из системы командой 

docker image rm alpine 

Как вы видите, никаких имиджей у меня сейчас больше нет.

Далее, для загрузки докер-имиджа из tar-архива нужно вызвать команду 

docker load -i alpine-image.tar

В ключе “-i” указывается имя файла с архивом. Причем обратите внимание, докер-имидж восстановился именно с тем же репозиторием, тэгом и даже image id. Последнее, правда, удивительно.

Когда это может быть полезно. В моей практике был случай, когда у нас в проекте был Dockerfile но у одного из разработчиков не проходила локальная сборка этого файла из-за каких-то проблем с промежуточной командой “npm install”. Времени разбираться особо у нас с тот момент не было, и мы просто сохранили имидж в архив с машины у одного разработчика и восстановили командой docker load на машине, где была проблема со сборкой.

Команды docker export и docker import

Если команды save/load довольно просты для понимания – выгружают и загружают докер-имидж, то взаимосвязь между export/import не такая линейная. Команда docker export – выгружает файловую систему докер-контейнера как tar-архив. Когда это может быть полезно. Например, если во время работы контейнера создаются некие артефакты, которые довольно трудоемко пересоздать или можно использовать docker export чтобы сделать своего рода «бэкап» для докер-контейнера. Для демонстрации работы этой команды запустим временный контейнер на основе alpine докер-имиджа командой

docker run --rm -it alpine sh

Далее откроем второй терминал/командную строку и командой 

docker export -o alpine-fs.tar 8f4ae688ed8a

сохраним файловую систему контейнера в tar-архив

Теперь рассмотрим команду docker import. Она не создает докер-контейнер как можно было бы ожидать. Команда docker import на основе tar-архива, созданного командой docker export создает опять-таки докер-имидж. А вот на основе этого докер-имиджа уже можно развернуть докер-контейнер.

docker import alpine-fs.tar alpine-fs

Заключение

В заключение повторю ключевые идеи из статьи

  • docker save – сохраняет докер-имидж как tar-архив. Этот архив можно, например, скопировать на другую машину.
  • docker load – создаёт докер-имидж из tar-архива созданного командой docker save
  • docker export – сохраняет файловую систему докер-контейнера как как tar-архив.
  • docker import – создает докер-имидж, а не докер-контейнер из tar-архива созданного командой docker export.