Как сохранить образ контейнера в файл

от admin

Перевод двух статей: «О том, как коммитить измнения в Docker образ» и «Руководство по перемещению Docker контейнеров»

О том, как коммитить изменения в Docker образ

Джек Уаллен, 27 апреля 2017

Если вам нравится использовать докер образы в качестве шаблонов для эффективного деплоя контейнеров, Джек Уоллен покажет вам, как коммитить изменения в запущенный контейнер для создания нового докер образа.

Один способ, которым ваша компания может обращаться с докер контейнерами — создание шаблонных образов для использования в ваших контейнерах. Скажем, для примера, вы используете контейнеры в целях разработки и хотите быть уверены, что все задеплоенные контейнеры стартуют с тем же самым базовым набором инструментов. Вы можете сделать pull образа, запустить контейнер, модифицировать его для того, чтобы он удовлетворял вашим потребностям, а затем начать разработку с этим контейнером, но вы должны будете повторять тот же самый процесс каждый раз, когда вам нужно будет деплоить этот контейнер.

Или же, вы можете сделать pull образа, запустить контейнер, модифицировать его, чтобы он удовлетворял основным потребностям ваших разработчиков, и закоммитить эти изменения в новый образ. Теперь, все, что нужно вашим разработчикам — запустить новый контейнер, базирующийся на модифицированном образе, и они могут это сделать. Им нет нужны модифицировать для этого исходный образ.

Если все это выглядит как процесс, который вы хотите внедрить, удача на вашей стороне — это действительно довольно просто. Скажем, вам нужен образ, базирующийся на последней версии nginx, с установленными PHP, build-essential и nano. Я проведу вас через процесс pull’а образа, запуска контейнера, подключения к нему, добавления программного обеспечения и коммита изменений в новый образ, который может быть запросто использован как базовый для ваших контейнеров.

Pull образа и запуск контейнера

Первый шаг — pull последнего образа nginx. Это выполнено командой:

docker pull nginx

Как только образ загружен, мы можем запустить его, так что мы можем использовать окно терминала таким образом:

docker run —name nginx-template-base -p 8080:80 -e TERM=xterm -d nginx

Я назвал его nginx-template-base, так как это будет то, на чем наш шаблон будет основан.

Подключение и модификация контейнера

Дальше нам нужно получить доступ к контейнеру. Когда вы запустите команду docker run, она покажет вам длинный идентификатор. Запустите команду:

docker exec -it CONTAINER_ID bash

Где CONTAINER_ID — это ID, показынный на экране, когда вы запустили команду run.

После запуска этой команды вы окажетесь с терминале запущенного контейнера. Теперь давайте добавим необходимое программное обеспечение в шаблон. Для этого запустите следующие команды.

apt-get install nano
​apt-get install build-essential
​apt-get install php5

Заметка: для официального образа nginx PHP 7 недоступен для установки без добавления репозитория.

Выйдите из контейнера и закоммитьте изменения

Теперь, так как мы модифицировали контейнер, нам нужно закоммитить изменения. Во-первых, выйдите из контейнера командой exit. Для коммита изменений и создания нового образа, базирующегося на изменениях выше, выполните команду:

docker commit CONTAINER_ID nginx-template

Где CONTAINER_ID — ID, данный вам, когда вы первоначально запустили контейнер.

Если вы запустите команду docker images, вы увидите новый контейнер (Иллюстрация B):

image
Иллюстрация В. Свежесозданный шаблон образа готов к использованию.

В этом пункте, вы можете подготовить к запуску новый контейнер, используя новый образ, имея все модификации на месте. Запомните. когда вы запускаете новый контейнер, команда будет выглядать примерно так:

docker run —name nginx-dev -p 8080:80 -e TERM=xterm -d nginx-template

Если вы войдете в этот новый контейнер (используя команду docker exec), вы увидите, что все установленное на месте и готово к использованию.

Легкий путь к шаблонам контейнеров

Если вы ищете способ сделать работу с Docker контейнерами немного более эффективной, этого вам хватит надолго. Как только вы станете создавать шаблоны образов, разработка с Docker контейнерами станет значительно проще.

Руководство по перемещению Docker контейнеров

Рик Донато, 28 октября 2016.

Docker предоставляет различные команды/методы для перемещения контейнеров. В этой статье вы увидите все эти команды, необходимые для перемещения ваших Docker контейнеров между вашими хостами и репозиториями, в примерах.

Из репозитория в репозиторий

Давайте взглянем на то, как мы получаем образ из репозитория, и как мы доставляем наш локальный образ в удаленный репозиторий.

Команда docker pull используется для того, чтобы получить образ из репозитория.

$ docker pull busybox
Using default tag: latest
latest: Pulling from library/busybox
Digest: sha256:29f5d56d12684887bdfa50dcd29fc31eea4aaf4ad3bec43daf19026a7ce69912
Status: Image is up to date for busybox:latest

Совет: по умолчанию, Docker будеть пуллить из docker.io. Для пулла из другого репозитория добавьте имя хоста вашего реестра к команде docker pull, т.е. docker pull registry.fir3net.com/busybox ([1]).

Для перемещения образов из репозитория в репозиторий используется docker push. Ниже показаны шаги, затрагивающие push образа в репозиторий.

  1. Аутентификация — если она требуется репозиторием, то выполняется командой docker login
  2. Пометка тегом — обеспечивается командой docker tag
  3. Push — для этого используется команда docker push

// LOGIN
$ docker login registry.fir3net.com
Username: felix001
Password:
Login Succeeded

// TAG
$ docker tag busybox registry.fir3net.com/busybox-v0.0.1

// PUSH
$ docker push registry.fir3net.com/busybox-v0.0.1
The push refers to a repository [registry.fir3net.com/busybox-v0.0.1] (len: 1)
Sending image list
Pushing repository registry.fir3net.com/busybox-v0.0.1 (1 tags)
d3a1f33e8a5a: Image successfully pushed
c22013c84729: Image successfully pushed
d74508fb6632: Image successfully pushed
91e54dfb1179: Image successfully pushed
Pushing tag for rev [91e54dfb1179] on

С хоста на хост

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

EXPORT или SAVE

Хорошо, давайте взглянем на команды docker export и docker save. docker export сохраняет запущенный или поставленный на паузу экземпляр ([2]) контейнера в tar файл. docker save сохраняет образ в tar файл.

Ниже примеры этих двух команд:

$ docker ps
CONTAINER ID IMAGE COMMAND
5e8f397be6fa busybox «sh»

$ docker export 5e8f397be6fa -o busybox-container.tar

$ docker images
REPOSITORY TAG IMAGE ID
busybox latest e02e811dd08f

$ docker save -o busybox-image.tar busybox

IMPORT или LOAD

Наконец, к с первоначально созданном tar файлам применяются команды docker import и docker load.

docker import используется для импортирования tar файла (т.е. контейнера), созданного через docker export. docker load для загрузки tar файла (т.е. образа), созданного через docker save.

Выгрузка, загрузка и распространение образов контейнеров Docker в виде архива

Стандартный способ распространения образов Docker — использование репозиториев Docker, которые позволяют как опубликовать вновь созданные образы, так и скачать их для локального использования. Развернуть локальный реестр Docker можно за 1 минуту, однако, для полноценного использования требуется больше действий, например, установка SSL-сертификата и поддержка авторизации.

Бывают случаи, когда серверы, на которых планируется выполнять контейнеры, созданные из образов, полностью изолированы от сегмента сети и не могут скачать себе образ из реестра. В этом случае у разработчиков возникает необходимость каким-то образом сформировать образ контейнера на сервере. Команда docker build тоже часто не подходит, поскольку большинство образов при сборке скачивает зависимости и необходимые слои из сети. Если хост не имеет подключения к сети, то и скачать ничего не сможет.

К счастью, Docker предоставляет стандартный механизм для распространения образов без использования реестров с помощью импорта и экспорта. Далее в статье мы рассмотрим как воспользоваться этими возможностями для того, чтобы эффективно распространять образы на серверы, где подключение к интернет невозможно.

Вообще, данный подход можно применять и в ряде других случаев, часть из которых мы перечислим ниже:

  • обеспечение развертывания без сети;
  • гарантированное развертывание с твердого носителя (USB, DVD);
  • поставка в форме готового к использовании дистрибутива;
  • минимизация инфраструктуры за счет исключения лишних элементов (registry).

Сохранение образа в архив

Для начала рассмотрим как можно выполнить сохранение образа контейнера из среды. Для выполнения данной операции используется команда docker save (man docker-save):

Читать:
1с 8 упп где варианты ответов

После выполнения данной команды образ со всеми слоями будет выгружен из пространства образов демона Docker в файловую систему в виде архива tar.

Интересно, что таким образом можно выгрузить более одного образа:

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

Загрузка образа в среду Docker

Для выполнения загрузки ипользуется обратная операция docker load:

Таким образом вы можете распространять образы контейнеров Docker между узлами без использования реестра и даже сети, например, на DVD или накопителе USB.

Отличия Save, Load от Export, Import

Docker поддерживает команды export и import, которые часто могут быть перепутаны с save, load. Ключевое отличие данных команд в том, для чего они предназначены:

  • save/load выгружают и загружают образы контейнеров, которые будут использоваться для создания контейнеров;
  • export выгружает файловую систему созданного контейнера (не образ контейнера, а изменения, которые внес контейнер в образ);
  • import позволяет создать образ тома файловой системы из архива, созданного с помощью export, который может использоваться, например, при запуске контейнера с помощью —volumes-from.

В целом, разница заключается, что save/load относятся к данным образов, а export/import к данным контейнеров.

Docker Образы

Образ Docker — это шаблон, доступный только для чтения, используемый для создания контейнеров.

Образы используются для хранения и отправки приложений.

docker images

Список образов верхнего уровня, их теги, размеры и репозитории можно получить выполнив

REPOSITORY TAG IMAGE ID CREATED SIZE andreyolegovichru/docker101tutorial latest dd2e76a16950 9 hours ago 26.8MB docker101tutorial latest dd2e76a16950 9 hours ago 26.8MB <none> <none> f5578f194936 9 hours ago 123MB <none> <none> 409d2b2d3c0b 9 hours ago 110MB <none> <none> c26bbf7dc236 9 hours ago 224MB python alpine fbfb63e3c6bb 17 hours ago 80.3MB nginx alpine ecd67fe340f9 4 days ago 21.6MB node 12-alpine 057fa4cc38c2 2 weeks ago 89.3MB hello-world latest bf756fb1ae65 6 months ago 13.3kB

Pull: скачивание образов

С помощью команды pull можно скачивать образы не запуская их.

Скачать образ с Ubuntu

docker pull ubuntu

Using default tag: latest latest: Pulling from library/ubuntu 692c352adcf2: Pull complete 97058a342707: Pull complete 2821b8e766f4: Pull complete 4e643cc37772: Pull complete Digest: sha256:55cd38b70425947db71112eb5dddfa3aa3e3ce307754a3df2269069d2278ce47 Status: Downloaded newer image for ubuntu:latest docker.io/library/ubuntu:latest

Проверить обновились ли образы

REPOSITORY TAG IMAGE ID CREATED SIZE andreyolegovichru/docker101tutorial latest dd2e76a16950 19 hours ago 26.8MB docker101tutorial latest dd2e76a16950 19 hours ago 26.8MB <none> <none> f5578f194936 19 hours ago 123MB <none> <none> 409d2b2d3c0b 19 hours ago 110MB <none> <none> c26bbf7dc236 19 hours ago 224MB python alpine fbfb63e3c6bb 27 hours ago 80.3MB nginx alpine ecd67fe340f9 4 days ago 21.6MB ubuntu latest adafef2e596e 8 days ago 73.9MB node 12-alpine 057fa4cc38c2 2 weeks ago 89.3MB hello-world latest bf756fb1ae65 6 months ago 13.3kB

Если Вам нужен не последний образ а какая-то определённая версия — укажите её после двоеточия.

Например, если нужна Ubuntu 14.04

docker pull ubuntu:14.04

Удалить образ можно командой rmi

docker rmi ubuntu:14.04

Можно удалять не по имени, а с помощью IMAGE ID, например, если я хочу удалить образ hello-world IMAGE ID которого bf756fb1ae65

docker rmi bf756fb1ae65

Репозиторий образов hub.docker.com

Изучить список доступных образов можно на сайте hub.docker.com

Нужно нажать на кнопку Explore в верхнем меню hub.docker.com/search

Установка Docker в Windows 10 изображение с сайта www.andreyolegovich.ru

Список выглядит следующим оригинальным образом:

Установка Docker в Windows 10 изображение с сайта www.andreyolegovich.ru

Образов очень много, советую пользоваться поиском или фильтрами. Docker Certified означает официльный образ.

У официальных образов названия указаны просто: debian , python , php и так далее. Это называется «Top Level Image»

Если источник не подтверждён, например, если я сделаю какой-то образ, например приложение для сайта TopBicycle.ru то имя будет выглядеть так: andreyolegovich/topbicycle-ru

То есть сперва имя автора, затем имя образа. Не все компании верифицируют образы. Например, софт для нагрузочного тестирования Yandex Tank выложен как direvius/yandex-tank

save: сохранить образ в архив

Если нужно сохранить образ в .tar файл, например, для передачи на другой хост

docker save aredelcom/aredel_browser_lite:27.0 > aredel_browser.tar

load: выгрузить образ из архива

Если вы получили образ в виде .tar файла, распаковать его можно командой load

docker load < /opt/aredel/containers/aredel_browser.tar

После загрузки образ будет иметь оригинальное название, а не название архива

REPOSITORY TAG IMAGE ID CREATED SIZE aredelcom/aredel_browser_lite 27.0 736bd91205de 9 hours ago 1.0GB

tag: подставить нужный образ

У ваш софт пользуется определённым образом. Имя этого образа указано в настройках, например в .toml файле. Вам нужно заменить его другим похожим образом, например, следующей версией.

Чтобы не менять постоянно название в настройках можно скачать второй образ и подставлять его вместо первого командой tag

REPOSITORY TAG IMAGE ID CREATED SIZE aredelcom/aredel_browser_lite 27.0 726bd91205de 9 hours ago 1.0GB aredel_browser latest 845d799ca1f0 3 weeks ago 1.04GB aredelcom/aredel_browser_lite 26.0 845d799ca1f0 3 weeks ago 1.04GB

Программой используется образ aredel_browser. В данный момент это образ версии 26.0 — можно убедиться посмотрев на одинаковые ID.

Подставить 27-ю версию можно выполнив команду tag

docker tag aredelcom/aredel_browser_lite:27.0 aredel_browser

REPOSITORY TAG IMAGE ID CREATED SIZE aredel_browser latest 726bd91205de 9 hours ago 1.00GB aredelcom/aredel_browser_lite 27.0 726bd91205de 9 hours ago 1.0GB aredelcom/aredel_browser_lite 26.0 845d799ca1f0 3 weeks ago 1.04GB

Изображение баннера

Публикация образов в Docker Hub

Сперва нужно создать аккаунт на докерхабе, сделать там репозиторий. Я назвал репозиторий jenkins-docker-slave так как делаю образ для работника Jenkins

Залогиниться в свой аккаунт можно командой docker login

docker login —username=andreissh

WARNING! Your password will be stored unencrypted in /home/andrei/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded

Нужно написать Dockerfile и собрать образ командой build

Пример такого докерфайла вы можете изучить здесь

docker build -t jenkins-docker-slave:1.0 .

С помощью команды tag подготовим копии образа с названием в формате

репозиторий / образ : версия

docker tag jenkins-docker-slave:1.0 andreissh/jenkins-docker-slave:1.0
docker tag jenkins-docker-slave:1.0 andreissh/jenkins-docker-slave:latest
docker images

REPOSITORY TAG IMAGE ID CREATED SIZE andreissh/jenkins-docker-slave 1.0 0aebbb7255ed 5 minutes ago 915MB andreissh/jenkins-docker-slave latest 0aebbb7255ed 5 minutes ago 915MB jenkins-docker-slave 1.0 0aebbb7255ed 5 minutes ago 915MB

Отправить образ на докерхаб можно командой docker push

docker push andreissh/jenkins-docker-slave:1.0

The push refers to repository [docker.io/andreissh/jenkins-docker-slave] 5e67247e476e: Pushed 5834b8278bb9: Pushed 6b4ad81eb09a: Pushed 1b0c531a1de3: Pushed 77f335c4dfa4: Pushed 3d9a7ec04e48: Pushed 6515074984c6: Mounted from library/ubuntu 1.0: digest: sha256:2986eb4bd51548889f2e6eaa18b649cfeef9d2a783811812f7771af56c1f61fd size: 1783

docker push andreissh/jenkins-docker-slave:latest

The push refers to repository [docker.io/andreissh/jenkins-docker-slave] 5e67247e476e: Layer already exists 5834b8278bb9: Layer already exists 6b4ad81eb09a: Layer already exists 1b0c531a1de3: Layer already exists 77f335c4dfa4: Layer already exists 3d9a7ec04e48: Layer already exists 6515074984c6: Layer already exists latest: digest: sha256:2986eb4bd51548889f2e6eaa18b649cfeef9d2a783811812f7771af56c1f61fd size: 1783

Образы должны появиться в хабе

Jenkins-docker-slave изображение с сайта www.andreyolegovich.ru

Образы на hub.docker.com
www.andreyolegovich.ru

Удалить все образы

Нужно сделать то же самое, но вместо rm выполнить rmi а вместо ps выполнить images

docker rmi $( docker images -q )

Форсированное удаление выполняется с помощью флага —force

docker rmi —force 8d788d646766

Подпишитесь на Telegram канал @aofeed чтобы следить за выходом новых статей и обновлением старых

docker save

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

Usage

Обратитесь к разделу опций для обзора доступных OPTIONS для этой команды.

Description

Создает репозиторий tarred для стандартного потока вывода. Содержит все родительские слои и все теги + версии или указанный repo:tag для каждого предоставленного аргумента.

Примеры использования этой команды см. в разделе примеров ниже.

Options

Name, shorthand Default Description
—output , -o Запишите в файл,а не в STDOUT.

Examples

Создайте резервную копию, которую затем можно будет использовать с docker load .

Сохраните изображение в файл tar.gz с помощью gzip.

Вы можете использовать gzip для сохранения файла изображения и уменьшения размера резервной копии.

особые теги Cherry-pick

Вы можете даже выбирать отдельные теги репозитория изображений с помощью вишни.

Похожие статьи