В Linux контейнеры работают на базовых механизмах ядра — namespaces, chroot и cgroups, поэтому их можно собрать без Docker. Для создания минимального образа сначала делают пустой каталог, делают его корневой файловой системой через chroot и постепенно добавляют необходимые программы и их динамические библиотеки (проверяя зависимости командой ldd). Namespaces изолируют процессы и окружение, а cgroups ограничивают ресурсы. Таким образом, полностью самостоятельный контейнер можно собрать, используя только встроенные возможности Linux.
