Поиск по сайту:

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


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

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

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

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

Образ «с нуля»

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

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

FROM scratch

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

Что такое «скретч»?

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

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

Что можно добавить к изображениям, основанным на царапинах?

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

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

#include <stdio.h>
 
int main() {
    printf("Hello World");
    return 0;
}

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

gcc -o helloworld hello.c

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

./helloworld

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

FROM scratch
COPY helloworld /
CMD ["helloworld"]

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

docker build -t hello:latest .

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

Теперь запустите контейнер, используя ваш образ:

docker run hello:latest

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

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

Когда использовать скретч?

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

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

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

Краткое содержание

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

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

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




Все права защищены. © Linux-Console.net • 2019-2024