Как создать свои собственные базовые образы Docker «с нуля» — CloudSavvy IT

Образы Docker создаются из файла Docker, который определяет базовый образ и серию инструкций, которые добавляют ваши собственные слои файловой системы. Что произойдет, если вы захотите сделать свой собственный «Базовое изображение»? Вот как начать с нуля и создать полную файловую систему контейнера с нуля.

Что такое изображение?

Образы Docker обычно используют популярный дистрибутив Linux в качестве базового образа. Если вы написали FROM ubuntu: latest, FROM debian: latest или FROM alpine: latest, вы использовали операционную систему в качестве основы. Вы также можете использовать изображение, предварительно настроенное для определенного языка программирования или инфраструктуры, например FROM php: 8.0 или FROM node: 16.

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

Изображение «царапины»

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

Если вы хотите создать образ «с нуля», запись с нуля в вашем Dockerfile — лучший способ сделать это! Это дает вам файловую систему, которая для начала является чистым листом.

С нуля

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

Что такое «царапина»?

Эскизный «образ» выглядит и ощущается как обычный образ Docker. Это даже перечислен в Docker Hub. Царапина на самом деле не является изображением — это зарезервированное ключевое слово, которое обозначает самый нижний уровень файловой системы функционирующего изображения. Все образы Docker лежат на пустом месте как их общая основа.

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

Что можно добавить к изображениям с нуля?

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

Вот рабочая демонстрация, которая запускает крошечную программу «hello world», скомпилированную из C:

#include int main () {printf («Привет, мир»); возврат 0; }

Скомпилируйте свой C-код в двоичный файл:

gcc -o helloworld hello.c

Запустите свой двоичный файл и посмотрите, что на вашем терминале напечатано «hello world»:

./Привет, мир

Теперь вы можете создать контейнер Docker с нуля, который запускает ваш двоичный файл:

С нуля КОПИРОВАТЬ helloworld / CMD [«helloworld»]

Создайте свой образ:

docker build -t привет: последний.

Проверка изображения с помощью docker inspect покажет, что у него один слой. Файловая система этого изображения содержит только один файл, двоичный файл helloworld.

Теперь запустите контейнер с вашим изображением:

докер запустить привет: последний

Вы увидите «hello world» на своем терминале, когда ваш скомпилированный двоичный файл будет запущен. Ваше созданное с нуля изображение содержит только ваш двоичный файл, поэтому его размер будет всего несколько килобайт. Использование любого базового образа операционной системы увеличило бы его до нескольких мегабайт, даже с минимальным дистрибутивом, таким как Alpine.

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

Когда использовать Scratch?

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

Scratch предоставляет вам чистый лист для работы, поэтому для правильного написания вашего Dockerfile и его поддержки в течение долгого времени требуются некоторые начальные вложения. Некоторые команды Docker, такие как attach, не будут работать по умолчанию, так как внутри вашего контейнера не будет оболочки, если вы ее не добавите.

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

Резюме

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

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

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

Похожие записи

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

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