Контейнер без Docker. Собираем контейнер в Linux своими руками

Контейнер без Docker. Собираем контейнер в Linux своими руками — Cybersecurity | Versia.media

Содержание статьи

Что внутри

Строим изолированную файловую систему с нуля

Шаг 1. Создаем пустую систему

Шаг 2. Пытаемся войти в систему

Шаг 3. Добавляем первую программу

Шаг 4. Проверяем зависимости

Шаг 5. Добавляем библиотеки

Шаг 6. Проверяем нашу мини-систему

Шаг 7. Добавляем базовые утилиты

Создаем минимальную систему Linux с BusyBox

Шаг 1. Создаем файловую систему

Шаг 2. Копируем BusyBox

Шаг 3. Создаем команды

Шаг 4. Запускаем систему

Проверяем ограниченность chroot

Что мы получили после BusyBox

Изолируем процессы: namespaces

Меняем hostname контейнера

Ограничиваем ресурсы с cgroups

Что такое cgroups

Создаем свою cgroup

Ограничиваем оперативную память

Ограничиваем CPU

Добавляем процесс в cgroup

Проверяем лимит CPU

Проверяем ограничение памяти

Общая схема контейнера

Чистка

Заключение

Да, за последние годы Docker фактически стал синонимом контейнеризации: разработчики запускают в нем приложения, администраторы разворачивают сервисы, а DevOps-инженеры строят инфраструктуру. Из-за этого кажется, что контейнеры — технология, которая появилась вместе с Docker. На самом деле это не так.

Сегодня посмотрим, как собрать минимальную систему Linux с нуля, узнаем, почему chroot — это еще не контейнер, выясним, как работают namespaces и как ограничивать ресурсы через cgroups. Все это вместе позволит нам подготовить свой контейнер средствами системы, а заодно узнать, как конкретно устроена контейнеризация.

Что внутри

Прежде чем заняться контейнером, разберемся, из каких механизмов он состоит. Хорошая новость: почти всё уже есть в Linux — нужно только научиться этим пользоваться.

В нашем «конструкторе контейнера» будут три главных механизма: - namespaces — изолируют процессы и окружение; - chroot — изолирует файловую систему; - cgroups — ограничивают ресурсы.

Каждый из этих механизмов можно пробовать хоть прямо сейчас. Но начнем по порядку.

Строим изолированную файловую систему с нуля

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

Для изоляции файловой системы используем механизм chroot. Он меняет корневой каталог процесса: указывает системе, что другая папка теперь корень /.

Шаг 1. Создаем пустую систему

Сначала создадим каталог, который станет корнем будущей системы:

Посмотрим, что внутри:

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

Шаг 2. Пытаемся войти в систему

Попробуем запустить chroot:

Видим ожидаемую ошибку:

Логично: внутри xakep нет даже шелла. Для процесса в chroot эта папка — корень системы, поэтому он ищет /bin/bash именно там.

Шаг 3. Добавляем первую программу

Создай каталог bin и скопируй туда bash:

Попробуем снова:

Ошибка никуда не делась: большинство программ для Linux используют динамические библиотеки, а их сейчас нет.

Шаг 4. Проверяем зависимости

Посмотреть, какие библиотеки нужны bash, можно так:

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

Продолжение доступно только участникам

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

9990 рублей 5000 р.

950 р.

M0xR

Веб-пентестер | Security researcher. Ищу уязвимости в веб-приложениях, анализирую архитектуру и логику систем, проверяю безопасность реальных сервисов buskins_holly5h@icloud.com

HTB VariaType. Записываем веб-шелл через обработчик шрифтов

Возможность загрузить свой шрифт на сайте может оказаться полноценной точкой входа в систе…

← Cybersecurity