Содержание статьи
- Что внутри
- Строим изолированную файловую систему с нуля
- Шаг 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.
Продолжение доступно только участникам
Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».
Присоединяйся к сообществу «Xakep.ru»!
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
