Давно собирался написать, как мы делаем образы для легковесной VMM Firecracker. Firecracker используется в нашем полносистемном программируемом фаззере CoreInfra AT1.
Нам необходимо иметь гибкий способ создания и расширения базовых образов.
Для этого мы используем следующую схему:
Ubuntu squashfs → Base Docker Image → Rootfs Docker Image → merged rootfs → tar → ext4
Сначала берется подготовленный Ubuntu squashfs для Firecracker и первый этап распаковывает squashfs, а второй превращает его содержимое в базовый Docker Image. Таким образом у нас получается базовый образ в точности соответствующий струкртуре изначального sqashfs образа для виртуальной машины.
Поверх базового образа применяется обычный Dockerfile.rootfs.
Через apt-get устанавливаются зависимости будущей VM: Python, Docker, containerd, runc, сертификаты и необходимые библиотеки.
Таким образом Docker выступает как конструктор файловой системы из подготовленного образа.
После сборки создается временный контейнер, а его объединённая файловая система экспортируется через docker export.
Далеее с помощью mkfs.ext4 создается ubuntu.rootfs.ext4, который подключается уже к Firecracker.
Такой способ удобен и для отладки в докер окружении и непосредственно для запуска виртуальной машины, а также удобен для интеграции в CI если вам необходимы изолированные кастомные зависимости. Т.е. докер не как среда запуска, а как способ менеджмента файловой системы и зависимостей.
PS: если тема интересна, пишите в комментарии – выложу докерфайлы.
– @tthread
Нам необходимо иметь гибкий способ создания и расширения базовых образов.
Для этого мы используем следующую схему:
Ubuntu squashfs → Base Docker Image → Rootfs Docker Image → merged rootfs → tar → ext4
Сначала берется подготовленный Ubuntu squashfs для Firecracker и первый этап распаковывает squashfs, а второй превращает его содержимое в базовый Docker Image. Таким образом у нас получается базовый образ в точности соответствующий струкртуре изначального sqashfs образа для виртуальной машины.
Поверх базового образа применяется обычный Dockerfile.rootfs.
Через apt-get устанавливаются зависимости будущей VM: Python, Docker, containerd, runc, сертификаты и необходимые библиотеки.
Таким образом Docker выступает как конструктор файловой системы из подготовленного образа.
После сборки создается временный контейнер, а его объединённая файловая система экспортируется через docker export.
Далеее с помощью mkfs.ext4 создается ubuntu.rootfs.ext4, который подключается уже к Firecracker.
Такой способ удобен и для отладки в докер окружении и непосредственно для запуска виртуальной машины, а также удобен для интеграции в CI если вам необходимы изолированные кастомные зависимости. Т.е. докер не как среда запуска, а как способ менеджмента файловой системы и зависимостей.
PS: если тема интересна, пишите в комментарии – выложу докерфайлы.
– @tthread