Содержание статьи
- Что внутри
- Строим изолированную файловую систему с нуля
- Шаг 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. Создаем пустую систему
Сначала создадим каталог, который станет корнем будущей системы:
mkdir xakep
Посмотрим, что внутри:
ls xakep
Каталог пуст. Сейчас это обычная папка, но именно здесь будет файловая система нашего будущего контейнера.
Шаг 2. Пытаемся войти в систему
Попробуем запустить chroot:
sudo chroot xakep /bin/bash
Видим ожидаемую ошибку:
chroot: failed to run command '/bin/bash': No such file or directory
Логично: внутри xakep нет даже шелла. Для процесса в chroot эта папка — корень системы, поэтому он ищет / именно там.
Шаг 3. Добавляем первую программу
Создай каталог bin и скопируй туда bash:
mkdir -p xakep/bin
cp /bin/bash xakep/bin/
Попробуем снова:
sudo chroot xakep /bin/bash
Ошибка никуда не делась: большинство программ для Linux используют динамические библиотеки, а их сейчас нет.
Шаг 4. Проверяем зависимости
Посмотреть, какие библиотеки нужны bash, можно так:
ldd /bin/bash
Команда ldd показывает, какие динамические библиотеки нужны программе для запуска; здесь она помогает понять, какие файлы понадобятся для нашего минимального rootfs.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»
