docker слои что такое

Слои в образе

Знаете ли вы, что можно посмотреть, из чего состоит образ? С помощью команды docker image history можно просмотреть команды, которые использовались для создания каждого слоя в образе.

Вы должны получить примерно следующие выходные данные (даты и идентификаторы могут отличаться).

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

Кэширование слоев

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

После изменения слоя все нижестоящие слои также необходимо создать заново.

Давайте еще раз взглянем на файл Dockerfile, который вы использовали…

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

Должен отобразиться примерно следующий результат.

Вы увидите, что все слои были перестроены. Прекрасно, ведь вы совсем немного изменили файл Dockerfile.

Многоэтапная сборка

Хотя в этом уроке мы и не будем углубляться в детали многоэтапных сборок, но они являются невероятно мощным средством для использования нескольких этапов для создания образа. У них есть несколько преимуществ.

Пример с Maven и Tomcat

При создании приложений на основе Java для компиляции исходного кода в байт-код Java требуется JDK. Но JDK не требуется в рабочей среде. Кроме того, можно использовать такие средства, как Maven или Gradle, для облегчения сборки приложения. Они также не нужны в окончательном образе. Здесь поможет многоэтапная сборка.

Пример React

При создании приложений React требуется среда узла для компиляции кода JS (обычно JSX), таблиц стилей SASS и др. в статический HTML, JS и CSS. Если вы не выполняете отрисовку на стороне сервера, вам даже не нужна среда узла для рабочей сборки. Почему бы не отправить статические ресурсы в статическом контейнере nginx?

Здесь мы используем образ node:12 для выполнения сборки (максимально используя уровень кэширования) и затем копируем выходные данные в контейнер nginx. Здорово, правда?

Резюме

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

Источник

Докер с нуля: понимание образов

Russian (Pусский) translation by Ilya Nikov (you can also view the original English article)

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

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

Понимание слоев

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

Порядок важен. Если вы добавите файл на один уровень и удалите его на другом уровне, вам лучше сделать это в правильном порядке. Docker отслеживает каждый уровень. Образ может состоять из десятков слоев (предел равен 127). Каждый слой очень легкий. Преимущество слоев заключается в том, что образу могут совместно использовать слои.

Если у вас много образов на основе похожих слоев, таких как базовая ОС или общие пакеты, то все эти общие слои будут храниться только один раз, а служебные данные для каждого образа будут только уникальными слоями этого конкретного образа.

Копирование при записи

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

Это не означает, что контейнер не может изменять файлы со своего уровня образа. Он определенно может. Но он создаст копию в своем верхнем слое, и с этого момента любой, кто пытается получить доступ к файлу, получит копию верхнего уровня. Когда файлы или каталоги удаляются с нижних слоев, они становятся скрытыми. Исходные слои образов идентифицируются хэш-криптографическим содержимым. Уровень чтения и записи контейнера идентифицируется с помощью UUID.

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

Вопросы дизайна для образов докера

Уникальная организация в слоях и стратегия копирования на запись предоставляют некоторые методы создания и компоновки образов Docker.

Минимальные образы: чем меньше тем лучше

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

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

Объединение слоев

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

Например, если вы устанавливаете набор пакетов, вы можете иметь слой для каждого пакета, установив каждый пакет в отдельную команду RUN в свой файл Docker:

Или вы можете объединить их в один слой с одной командой RUN.

Выбор базового образа

Ваш базовый образ (практически никто не создает образ с нуля) часто является важным решением. Он может содержать много слоев и добавлять множество возможностей, но также и будет иметь большой вес. Качество образа и автора также имеют решающее значение. Вы не хотите, чтобы ваши образы отображались на некотором не очень качественном образе, где вы точно не знаете, что там есть, и можете ли вы доверять его автору.

Существуют официальные образы для многих дистрибутивов, языков программирования, баз данных и сред выполнения. Иногда вариантов просто огромное количество. Не торопитесь и сделайте правильный выбор.

Проверка образов

Давайте посмотрим на некоторые образы. Вот список образов, доступных в настоящее время на моей машине:

Репозиторий и тег идентифицируют образа для людей. Если вы просто попытаетесь запустить или вытащить имя репозитория без указания тега, то по умолчанию используется «последний» тег. Идентификатор образа является уникальным идентификатором.

Давайте погрузимся и рассмотрим образ hello-world:

Интересно посмотреть, сколько информации связано с каждым образом. Я не буду перебирать каждый. Я просто упомянул интересный лакомый кусочек, что записи «container» и «containerConfig» относятся к временному контейнеру, создаваемому Docker при его создании. Здесь я хочу сосредоточиться на последнем разделе «RootFS». Вы можете получить только эту часть, используя поддержку шаблона Go для команды проверки:

Это работает, но мы потеряли хорошее форматирование. Я предпочитаю использовать jq:

Вы можете видеть, что типом является «Слои», и есть только один слой.

Давайте проверим слои образа Python:

Вау. Семь слоев. Но что это за слои? Мы можем использовать команду history, чтобы узнать это:

Как получить образ? Существует три способа:

Когда вы запускаете контейнер, вы указываете его образ. Если образ не существует в вашей системе, он извлекается из реестра Docker (по умолчанию DockerHub). Кроме того, вы можете напрямую вытащить образ, не запуская контейнер.

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

Наконец, и самое интересное, вы можете создавать свои собственные образы, что является темой второй части.

Вывод

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

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

Источник

Образы и контейнеры Docker в картинках

docker слои что такое. Смотреть фото docker слои что такое. Смотреть картинку docker слои что такое. Картинка про docker слои что такое. Фото docker слои что такое

Перевод поста Visualizing Docker Containers and Images, от новичка к новичкам, автор на простых примерах объясняет базовые сущности и процессы в использовании docker.

Если вы не знаете, что такое Docker или не понимаете, как он соотносится с виртуальными машинами или с инструментами configuration management, то этот пост может показаться немного сложным.

Пост предназначен для тех, кто пытается освоить docker cli, понять, чем отличается контейнер и образ. В частности, будет объяснена разница между просто контейнером и запущенным контейнером.

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

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

Хорошим примером является Git. Я не мог понять Git, пока не понял его базовую модель, включая trees, blobs, commits, tags, tree-ish и прочее. Я думаю, что люди, не понимающие внутренности Git, не могут мастерски использовать этот инструмент.

Определение образа (Image)

Визуализация образа представлена ниже в двух видах. Образ можно определить как «сущность» или «общий вид» (union view) стека слоев только для чтения.

docker слои что такое. Смотреть фото docker слои что такое. Смотреть картинку docker слои что такое. Картинка про docker слои что такое. Фото docker слои что такое

Слева мы видим стек слоев для чтения. Они показаны только для понимания внутреннего устройства, они доступны вне запущенного контейнера на хост-системе. Важно то, что они доступны только для чтения (иммутабельны), а все изменения происходят в верхнем слое стека. Каждый слой может иметь одного родителя, родитель тоже имеет родителя и т.д. Слой верхнего уровня может быть использован как UnionFS (AUFS в моем случае с docker) и представлен в виде единой read-only файловой системы, в которой отражены все слои. Мы видим эту «сущность» образа на рисунке справа.

Если вы захотите посмотреть на эти слои в первозданном виде, вы можете найти их в файловой системе на хост-машине. Они не видны напрямую из запущенного контейнера. На моей хост-машине я могу найти образы в /var/lib/docker/aufs.

Определение контейнера (Container)

Контейнер можно назвать «сущностью» стека слоев с верхним слоем для записи.

docker слои что такое. Смотреть фото docker слои что такое. Смотреть картинку docker слои что такое. Картинка про docker слои что такое. Фото docker слои что такое

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

Контейнер определяет лишь слой для записи наверху образа (стека слоев для чтения). Он не запущен.

Определение запущенного контейнера

Запущенный контейнер — это «общий вид» контейнера для чтения-записи и его изолированного пространства процессов. Ниже изображен контейнер в своем пространстве процессов.

docker слои что такое. Смотреть фото docker слои что такое. Смотреть картинку docker слои что такое. Картинка про docker слои что такое. Фото docker слои что такое

Изоляция файловой системы обеспечивается технологиями уровня ядра, cgroups, namespaces и другие, позволяют докеру быть такой перспективной технологией. Процессы в пространстве контейнера могут изменять, удалять или создавать файлы, которые сохраняются в верхнем слое для записи. Смотрите изображение:

docker слои что такое. Смотреть фото docker слои что такое. Смотреть картинку docker слои что такое. Картинка про docker слои что такое. Фото docker слои что такое

Чтобы проверить это, выполните команду на хост-машине:

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

Определение слоя образа (Image layer)

Наконец, мы определим слой образа. Изображение ниже представляет слой образа и дает нам понять, что слой — это не просто изменения в файловой системе.

docker слои что такое. Смотреть фото docker слои что такое. Смотреть картинку docker слои что такое. Картинка про docker слои что такое. Фото docker слои что такое

Метаданные — дополнительная информация о слое, которая позволяет докеру сохранять информацию во время выполнения и во время сборки. Оба вида слоев (для чтения и для записи) содержат метаданные.

docker слои что такое. Смотреть фото docker слои что такое. Смотреть картинку docker слои что такое. Картинка про docker слои что такое. Фото docker слои что такое

Кроме того, как мы уже упоминали раньше, каждый слой содержит указатель на родителя, используя id (на изображении родительские слои внизу). Если слой не указывает на родительский слой, значит он наверху стека.

docker слои что такое. Смотреть фото docker слои что такое. Смотреть картинку docker слои что такое. Картинка про docker слои что такое. Фото docker слои что такое

Расположение метаданных

На данный момент (я понимаю, что разработчики docker могут позже сменить реализацию), метаданные слоев образов (для чтения) находятся в файле с именем «json» в папке /var/lib/docker/graph/id_слоя:

где «e809f156dc985. » — урезанный id слоя.

Свяжем все вместе

Теперь, давайте посмотрим на команды, иллюстрированные понятными картинками.

docker create

До:
docker слои что такое. Смотреть фото docker слои что такое. Смотреть картинку docker слои что такое. Картинка про docker слои что такое. Фото docker слои что такое

После:
docker слои что такое. Смотреть фото docker слои что такое. Смотреть картинку docker слои что такое. Картинка про docker слои что такое. Фото docker слои что такое

docker слои что такое. Смотреть фото docker слои что такое. Смотреть картинку docker слои что такое. Картинка про docker слои что такое. Фото docker слои что такое

docker start

До:
docker слои что такое. Смотреть фото docker слои что такое. Смотреть картинку docker слои что такое. Картинка про docker слои что такое. Фото docker слои что такое

После:
docker слои что такое. Смотреть фото docker слои что такое. Смотреть картинку docker слои что такое. Картинка про docker слои что такое. Фото docker слои что такое

Команда ‘docker start’ создает пространство процессов вокруг слоев контейнера. Может быть только одно пространство процессов на один контейнер.

docker run

До:
docker слои что такое. Смотреть фото docker слои что такое. Смотреть картинку docker слои что такое. Картинка про docker слои что такое. Фото docker слои что такое

После:
docker слои что такое. Смотреть фото docker слои что такое. Смотреть картинку docker слои что такое. Картинка про docker слои что такое. Фото docker слои что такое

Один из первых вопросов, который задают люди (я тоже задавал): «В чем разница между ‘docker start’ и ‘docker run’?» Одна из первоначальных целей этого поста — объяснить эту тонкость.

docker слои что такое. Смотреть фото docker слои что такое. Смотреть картинку docker слои что такое. Картинка про docker слои что такое. Фото docker слои что такое

Как мы видим, команда ‘docker run’ находит образ, создает контейнер поверх него и запускает контейнер. Это сделано для удобства и скрывает детали двух команд.

Продолжая сравнение с освоением Git, я скажу, что ‘docker run’ очень похожа на ‘git pull’. Так же, как и ‘git pull’ (который объединяет ‘git fetch’ и ‘git merge’), команда ‘docker run’ объединяет две команды, которые могут использоваться и независимо. Это удобно, но поначалу может ввести в заблуждение.

docker ps

docker слои что такое. Смотреть фото docker слои что такое. Смотреть картинку docker слои что такое. Картинка про docker слои что такое. Фото docker слои что такое

Команда ‘docker ps’ выводит список запущенных контейнеров на вашей хост-машине. Важно понимать, что в этот список входят только запущенные контейнеры, не запущенные контейнеры скрыты. Чтобы посмотреть список всех контейнеров, нужно использовать следующую команду.

docker слои что такое. Смотреть фото docker слои что такое. Смотреть картинку docker слои что такое. Картинка про docker слои что такое. Фото docker слои что такое

docker images

docker слои что такое. Смотреть фото docker слои что такое. Смотреть картинку docker слои что такое. Картинка про docker слои что такое. Фото docker слои что такое

Команда ‘docker images’ выводит список образов верхнего уровня (top-level images). Фактически, ничего особенного не отличает образ от слоя для чтения. Только те образы, которые имеют присоединенные контейнеры или те, что были получены с помощью pull, считаются образами верхнего уровня. Это различие нужно для удобства, так как за каждым образом верхнего уровня может быть множество слоев.

docker слои что такое. Смотреть фото docker слои что такое. Смотреть картинку docker слои что такое. Картинка про docker слои что такое. Фото docker слои что такое

docker stop

До:
docker слои что такое. Смотреть фото docker слои что такое. Смотреть картинку docker слои что такое. Картинка про docker слои что такое. Фото docker слои что такое

После:
docker слои что такое. Смотреть фото docker слои что такое. Смотреть картинку docker слои что такое. Картинка про docker слои что такое. Фото docker слои что такое

Команда ‘docker stop’ посылает сигнал SIGTERM запущенному контейнеру, что мягко останавливает все процессы в пространстве процессов контейнера. В результате мы получаем не запущенный контейнер.

docker kill

До:
docker слои что такое. Смотреть фото docker слои что такое. Смотреть картинку docker слои что такое. Картинка про docker слои что такое. Фото docker слои что такое

После:
docker слои что такое. Смотреть фото docker слои что такое. Смотреть картинку docker слои что такое. Картинка про docker слои что такое. Фото docker слои что такое

Команда ‘docker kill’ посылает сигнал SIGKILL, что немедленно завершает все процессы в текущем контейнере. Это почти то же самое, что нажать Ctrl+\ в терминале.

docker pause

До:
docker слои что такое. Смотреть фото docker слои что такое. Смотреть картинку docker слои что такое. Картинка про docker слои что такое. Фото docker слои что такое

После:
docker слои что такое. Смотреть фото docker слои что такое. Смотреть картинку docker слои что такое. Картинка про docker слои что такое. Фото docker слои что такое

В отличие от ‘docker stop’ и ‘docker kill’, которые посылают настоящие UNIX сигналы процессам контейнера, команда ‘docker pause’ используют специальную возможность cgroups для заморозки запущенного пространства процессов. Подробности можно прочитать здесь, если вкратце, отправки сигнала Ctrl+Z (SIGTSTP) не достаточно, чтобы заморозить все процессы в пространстве контейнера.

docker rm

До:
docker слои что такое. Смотреть фото docker слои что такое. Смотреть картинку docker слои что такое. Картинка про docker слои что такое. Фото docker слои что такое

После:
docker слои что такое. Смотреть фото docker слои что такое. Смотреть картинку docker слои что такое. Картинка про docker слои что такое. Фото docker слои что такое

Команда ‘docker rm’ удаляет слой для записи, который определяет контейнер на хост-системе. Должна быть запущена на остановленном контейнерах. Удаляет файлы.

docker rmi

До:
docker слои что такое. Смотреть фото docker слои что такое. Смотреть картинку docker слои что такое. Картинка про docker слои что такое. Фото docker слои что такое

После:
docker слои что такое. Смотреть фото docker слои что такое. Смотреть картинку docker слои что такое. Картинка про docker слои что такое. Фото docker слои что такое

docker commit

До:
docker слои что такое. Смотреть фото docker слои что такое. Смотреть картинку docker слои что такое. Картинка про docker слои что такое. Фото docker слои что такоеили docker слои что такое. Смотреть фото docker слои что такое. Смотреть картинку docker слои что такое. Картинка про docker слои что такое. Фото docker слои что такое

После:
docker слои что такое. Смотреть фото docker слои что такое. Смотреть картинку docker слои что такое. Картинка про docker слои что такое. Фото docker слои что такое

Команда ‘docker commit’ берет верхний уровень контейнера, тот, что для записи и превращает его в слой для чтения. Это фактически превращает контейнер (вне зависимости от того, запущен ли он) в неизменяемый образ.

docker слои что такое. Смотреть фото docker слои что такое. Смотреть картинку docker слои что такое. Картинка про docker слои что такое. Фото docker слои что такое

docker build

До:
Dockerfile docker слои что такое. Смотреть фото docker слои что такое. Смотреть картинку docker слои что такое. Картинка про docker слои что такое. Фото docker слои что такоеи docker слои что такое. Смотреть фото docker слои что такое. Смотреть картинку docker слои что такое. Картинка про docker слои что такое. Фото docker слои что такое

После:
docker слои что такое. Смотреть фото docker слои что такое. Смотреть картинку docker слои что такое. Картинка про docker слои что такое. Фото docker слои что такое
Со многими другими слоями.

Команда ‘docker build’ интересна тем, что запускает целый ряд команд:
docker слои что такое. Смотреть фото docker слои что такое. Смотреть картинку docker слои что такое. Картинка про docker слои что такое. Фото docker слои что такое

На изображении выше мы видим, как команда build использует значение инструкции FROM из файла Dockerfile как базовый образ после чего:

1) запускает контейнер (create и start)
2) изменяет слой для записи
3) делает commit
На каждой итерации создается новый слой. При исполнении ‘docker build’ может создаваться множество слоев.

docker exec

До:
docker слои что такое. Смотреть фото docker слои что такое. Смотреть картинку docker слои что такое. Картинка про docker слои что такое. Фото docker слои что такое

После:
docker слои что такое. Смотреть фото docker слои что такое. Смотреть картинку docker слои что такое. Картинка про docker слои что такое. Фото docker слои что такое

Команда ‘docker exec’ применяется к запущенному контейнеру, запускает новый процесс внутри пространства процессов контейнера.

docker inspect |

До:
docker слои что такое. Смотреть фото docker слои что такое. Смотреть картинку docker слои что такое. Картинка про docker слои что такое. Фото docker слои что такоеили docker слои что такое. Смотреть фото docker слои что такое. Смотреть картинку docker слои что такое. Картинка про docker слои что такое. Фото docker слои что такое

После:
docker слои что такое. Смотреть фото docker слои что такое. Смотреть картинку docker слои что такое. Картинка про docker слои что такое. Фото docker слои что такое

Команда ‘docker inspect’ получает метаданные верхнего слоя контейнера или образа.

docker save

До:
docker слои что такое. Смотреть фото docker слои что такое. Смотреть картинку docker слои что такое. Картинка про docker слои что такое. Фото docker слои что такое

После:
docker слои что такое. Смотреть фото docker слои что такое. Смотреть картинку docker слои что такое. Картинка про docker слои что такое. Фото docker слои что такое

Команда ‘docker save’ создает один файл, который может быть использован для импорта образа на другую хост-систему. В отличие от команды ‘export’, она сохраняет все слои и их метаданные. Может быть применена только к образам.

docker export

До:
docker слои что такое. Смотреть фото docker слои что такое. Смотреть картинку docker слои что такое. Картинка про docker слои что такое. Фото docker слои что такое

После:
docker слои что такое. Смотреть фото docker слои что такое. Смотреть картинку docker слои что такое. Картинка про docker слои что такое. Фото docker слои что такое

Команда ‘docker export’ создает tar архив с содержимым файлов контейнера, в результате получается папка, пригодная для использования вне docker. Команда убирает слои и их метаданные. Может быть применена только для контейнеров.

docker history

До:
docker слои что такое. Смотреть фото docker слои что такое. Смотреть картинку docker слои что такое. Картинка про docker слои что такое. Фото docker слои что такое

После:
docker слои что такое. Смотреть фото docker слои что такое. Смотреть картинку docker слои что такое. Картинка про docker слои что такое. Фото docker слои что такое

Команда ‘docker history’ принимает и рекурсивно выводит список всех слоев-родителей образа (которые тоже могут быть образами)

Источник

Docker: иерархия и наследование слоев

docker слои что такое. Смотреть фото docker слои что такое. Смотреть картинку docker слои что такое. Картинка про docker слои что такое. Фото docker слои что такоеКаждый Docker-образ состоит из слоёв (layers), каждый из которых описывает какую-то инструкцию. Далее – Docker объединяет информацию из каждого слоя, и создает шаблон-образ, из которого запускается контерйнер, в котором выполняются инструкции из каждого слоя, который был включен в данный образ.

Для дальнейших примеров – возьмем образ unutu:latest :

В процессе загрузки видны четыре слоя.

Имя репозитория и тег тут указывают, что он является промежуточным слоем для какого-то целого образа.

Находим все файлы и каталоги, созданные для этих слоев:

В данном случае нас интересует каталог /var/lib/docker/graph/, который ещё назывется graph database. Именно в нем хранятся файлы слоев образов, которые нам нужны для получения всей картины.
Каждый каталог соответствует одному из имеющихся у Docker слоев:

Теперь – взглянем на список доступных образов:

Мы видим 1 образ с IMAGE ID d55e68e6cc9c.

Проверяем его каталог:

Файл checksum содержит в себе, как понятно из названия, контрольную сумму слоя:

А layersize – размер слоя (о самих данных – в другой раз).

Структура связей между слоями в Docker – иерархическая. Имеется некий базовый слой, на который “накладываются” остальные слои:

docker слои что такое. Смотреть фото docker слои что такое. Смотреть картинку docker слои что такое. Картинка про docker слои что такое. Фото docker слои что такое

Каждый слой описывает какое-то изменение, которое должно быть выполнено с данными на запущенном контейнере.

Как мы видели – при загрузке одного образа загружается несколько файлов слоев – в нашем случае 4, которые мы и внесли в массив при поиске каталогов:

А слой b207c06aba70 – содержит:

Корневой же слой этой записи уже не содержит:

Так вместе – они образуют шаблон образа.

Если ещё раз посмотреть на процесс запуска конейнера с этим образом, мы увидим, что:

Последним загружался 9377ad319b00 – самый большой по размеру, основной слой образа. Остальные слои – мельче, и только описывают изменения по отношению к предыдущему слою.

Далее, при старте контейнера с помощью docker run – Docker обратится к файлу /var/lib/docker/repositories (или /var/lib/docker/repositories-devicemapper в зависимости от драйвера UFS), в котором ищет заданный образ в локальном репозитории.

Т.е., у нас имеется образ репозитория ubuntu с тегом latest :

Docker обратится к файлу /var/lib/docker/repositories-devicemapper :

Собственно, именно так и формируются образы Docker.

Давайте создадим свой новый образ, из имещегося образа Ubuntu.

Создаём Dockerfile файл, из которого будем собирать этот образ, в котором прописываем:

И каталог /var/lib/docker/graph/ :

В котором видим два новых слоя:

Проверяем родителей, начиная от c12cbab7fec0:

Т.е. – наш образ ubuntu_upd:latest основан на тех же файлах слоев, которые используются образом ubuntu:latest + два “лишних” слоя, которые мы добавили “сами”, это c12cbab7fec0 и 4fe9b73744a4.

Каждая инструкция в Dockerfile вызывает создание нового слоя при сборке образа.

В нашем примере их два – это RUN apt-get update и CMD [«bash»] :

И второй новый слой:

Про контейнеры и данные в слоях – в следующей части.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *