LXC Builder - управление Linux контейнерами с помощью Python, консольный менеджер
Простой консольный менеджер для управления Linux контейнерами (LXC), написанный на Python. Сборка контейнеров из подготовленных шаблонов, автоматическая установка программного обеспечения, простая настройка и управление. Ограничение CPU, RAM, HDD, возможность указать путь для хранения контейнеров и многое другое.
Решил поделиться небольшой разработкой, которая упрощает процесс создания, запуска и управления контейнерами, собранными из легко настраиваемых шаблонов для разных операционных систем (ОС) и наборов программного обеспечения (ПО).
Содержание:
- Предназначение
- Основные возможности
- Структура проекта
- Шаблоны
- Подготовка к использованию
- Структура меню
- Несколько скриншотов консоли с рабочим процессом
- В завершение
Предназначение
Программа создавалась прежде всего для помощи при тестировании и разработке программного обеспечения используя LXC контейнеры.
Благодаря ей можно буквально в несколько шагов создать и запустить контейнер с уже предустановленным и настроенным набором программного обеспечения, которое доступно в изолированной полноценной ОС.
Один из примеров использования - создание и отладка проектов с применением так называемого стека технологий LAMP (Linux + Apache + PHP + MySQL), в которых версии установленного ПО (например PHP5, PHP7, MySQL 5.5 и т.д.) могут играть решающую роль.
Для тестирования работы гео-зависимых служб и сайтов можно создать несколько контейнеров с прокси-серверами.
LXC-контейнеры отлично подходят для обучения программированию, системному администрированию и DevOps. Используя LXCBuilder можно просто и удобно создавать заготовки контейнеров с различными ОС, управлять ими и писать шаблоны своих заготовок с наборами уже сконфигурированных программ и служб.
Также Python-класс "LXCBuilder" можно применить при разработке других программных систем, в которых задействован механизм изоляции LXC.
Основные возможности
Основные возможности и особенности проекта следующие:
- Поддержка LXC 2.0+;
- Построен с использованием вызовов родных команд lxc-*;
- Реализованы наиболее часто используемые при работе функции (create, start, stop, delete...);
- Использована основная библиотека модулей Python, нет других зависимостей;
- Можно указать свою директорию для хранения контейнеров;
- Поддержка собственных шаблонов для создания и настройки контейнеров.
Система шаблонов:
- Простота написания и редактирования;
- Возможность указать операционную систему, ее релиз и архитектуру;
- Ограничение ресурсов RAM, CPU + вся мощь опций CGroups;
- Возможность указать любую опцию для установки в конфигурационном файле контейнера;
- Возможно ограничить размер файловой системы (используются блочные loop-устройства);
- Скрипт для установки и настройки программного обеспечения внутри контейнера.
Важно! Скрипт работает только от имени привилегированного пользователя (root), работа с контейнерами от имени обычного пользователя не поддерживается.
Работа программы была отлажена и протестирована под Debian Stretch (9) GNU/Linux, архитектура amd64.
Структура проекта
Программа состоит из двух основных файлов с кодом на Python и конфигурационного файла, рядом с ними же находится директория с шаблонами.
* [templates] - директория с шаблонами
+ [name1] - директория шаблона с именем 'name1'
+ config.ini - файл настроек шаблона
+ install.sh - sh-скрипт, установка и настройка ПО внутри контейнера
+ README - информация о шаблоне и его использованию, полезности
+ ...
* config.ini - конфигурационный файл менеджера
* lxc_builder.py - класс для работы с LXC
* lxc_manager.py - консольный интерактивный менеджер для LXC
Исходный код программы простой, его с легкостью можно переделать или дополнить нужным функционалом.
Шаблоны
Система шаблонов - это иерархия из директорий, в которых хранятся файлы с настройками и командами для подготовки и сборки контейнеров с соответствующим набором программ и служб.
Список шаблонов по умолчанию и их характеристики:
- alpine-edge - шаблон с чистой установкой Alpine GNU/Linux (amd64) последней версии, 512M ОЗУ;
- centos-7 - шаблон с чистой установкой CentOS 7 (amd64), 1024M ОЗУ;
- debian-8 - шаблон с чистой установкой Debian 8 jessie (amd64), 1024M ОЗУ;
- debian-8-LAMP - Debian 8 jessie (amd64) с настроенной связкой Apache 2.4 + PHP 5.6 + MySQL 5.5 (файловая система - 700М, ОЗУ - 512М);
- debian-9 - шаблон с чистой установкой Debian 9 stretch (amd64), 1024M ОЗУ;
- debian-9-i2p - Debian 9 stretch (amd64) с настроенным демоном I2Pd (файловая система - 512М, ОЗУ - 256М);
- debian-9-tor-privoxy - Debian 9 stretch (amd64) с настроенной связкой TOR + Privoxy (файловая система - 512М, ОЗУ - 256М);
- debian-9-LAMP - Debian 9 stretch (amd64) с настроенной связкой Apache 2.4 + PHP 7.0 + MariaDB 10.1.37 (файловая система - 900М, ОЗУ - 512М);
- debian-10 - шаблон с чистой установкой Debian 10 buster (amd64), 1024M ОЗУ;
- debian-10-LAMP - Debian 10 buster (amd64) с настроенной связкой Apache 2.4.38 + PHP 7.3 + MariaDB 10.3.17 (файловая система - 1024М, ОЗУ - 512М);
- debian-11 - шаблон с чистой установкой Debian 11 Bullseye (amd64), 1024M ОЗУ;
- debian-11-LAMP - Debian 11 Bullseye (amd64) с настроенной связкой Apache 2.4.56 + PHP 7.4 + MariaDB 10.5.18 (файловая система - 1024М, ОЗУ - 512М);
- ubuntu-14 - шаблон с чистой установкой Ubuntu 14 (trusty, amd64), 1024M ОЗУ;
- ubuntu-16 - шаблон с чистой установкой Ubuntu 16 (xenial, amd64), 1024M ОЗУ.
- ubuntu-18 - шаблон с чистой установкой Ubuntu 18 (bionic, amd64), 1024M ОЗУ.
Все шаблоны с чистой установкой ОС настроены без ограничения размера файловой системы. Ниже будет рассказано о том, как при необходимости это можно исправить.
Свой шаблон можно создать с нуля или же скопировав за основу один из уже имеющихся. Для этого нужно в директории 'templates' создать новую папку с названием шаблона (желательно в формате "ОС-версия-назначение-программы") и поместить в нее три файла:
- config.ini- настройки операционной системы, ограничения ресурсов;
- install.sh - скрипт, написанный на SH для автоматического выполнения внутри контейнера после его создания с помощью LXCBuilder;
- README - информационный файл, описание и назначение контейнера, полезные заметки и ресурсы.
Файл config.ini содержит две секции с настройками - General и LXC_options.
Назначение опций в секции General:
- dist - указывается дистрибутив ОС, которая будет взята за основу при построении контейнера, например: debian, ubuntu, alpine, centos и т.п.;
- release - релиз ОС для выбранного дистрибутива, например: wheezy, jessie, stretch (для debian), edge (для alpine), trusty, xenial (для ubuntu);
- arch - архитектура выбранной ОС, например: i386, amd64;
- rootfs_size - ограничение размера корневой файловой системы для контейнера, например: 256M, 800M, 2G, 25G.
При указании для опции 'rootfs_size' значения отличного от нуля '0' файловая система будет распакована в файл, смонтированный через блочное loop-устройство (виртуальная файловая система).
В случае с нулевым значением этой опции все файлы корневой системы будут распакованы в папку 'rootfs', которая размещена в папке контейнера (рядом с файлом 'config'). Контейнеру будет доступен весь размер свободного места файловой системы, в которой расположена директория хранения контейнеров.
В секции 'LXC_options' содержится много опций и все они повторяют одноименные опции и значения тех, которые возможно задать в файле с настройки для контейнера - 'config'.
Подготовка к использованию
Для запуска и работы с LXCBuilder нужна установленная и настроенная система LXC. О ее установке и настройках, а также опциях для контейнеров вы можете узнать из статьи: Linux контейнеры - установка LXC в Debian GNU/Linux, подробная шпаргалка по командам.
Также потребуется Python 3 со стандартным набором библиотек, установим его:
sudo apt-get update
sudo apt-get install python3
Архив с LXCBuilder v.0.3 - 13 КБ.
Поместит скачанный архив в любую удобную папку и распакуйте его. Внесите изменения в файл настроек config.ini - задайте путь для хранения контейнеров.
Теперь можно пробовать запускать lxc_manager.py из консоли (от имени пользователя root), перейдя в папку с проектом:
python3 lxc_manager.py
Вас должен встретить простой и интуитивно понятный текстовый интерфейс.
Структура меню
Дерево меню программы:
--- LXCBuilder ---
* List & Manage
+ Select container
+ Start
+ Stop
+ Restart
+ Destroy
+ Freeze
+ UnFreeze
+ Console
+ Edit config
+ Generate lxc-* commands list
* Create
* Stop All
* Exit
После запуска программы к выбору доступны 4 пункта:
- List & Manage - печатает список доступных контейнеров и предлагает выбрать тот, с которым будем работать, после выбора будет выведено подменю с доступными действиями;
- Create - создание контейнера, будет предложено ввести название, группу и выбрать шаблон для построения образа;
- Stop All - остановка всех запущенных контейнеров;
- Exit - выход;
Несколько скриншотов консоли с рабочим процессом
Для демонстрации работы с консольным менеджером привожу два длинных скриншота. В данном случае контейнеры хранятся в директории, которая размещена в точке монтирования /tmp, которая в свою очередь смонтирована через tmpfs (файловая система в памяти, выделил для нее 5ГБ ОЗУ).
Это позволяет очень быстро развертывать и настраивать контейнеры для временной работы, к тому же нет лишней нагрузки на жесткий диск или SSD.
Если ваша система обладает хорошим объемом ОЗУ и LXC по большей части нужно для целей тестирования и разработки, то такой вариант размещения контейнеров может быть вам очень даже интересен.
Сразу после запуска менеджера в консоли будет отображено основное меню, а также шапка с полезной информацией о системе и настройках хранения контейнеров:
- OS - указано полное название ОС и версия используемого ядра Linux;
- SYS - размер оперативной памяти системы и модель ее микропроцессора;
- LXC version - текущая, установленная в системе версия системы LXC;
- Store path - полный путь к директории в которой будут храниться контейнеры;
- Store FS - информация о файловой системе для директории с контейнерами;
- Conatiners - количество присутствующих контейнеров в заданной директории.
Рис. 1. Процесс создания нового контейнера из шаблона в LXCBuilder.
Вот что происходит в данном примере:
- Выбираем 'Create' для создания контейнера;
- Вводим название контейнера - 'lamp-site1';
- Вводим название группы для этого контейнера - 'site';
- Выбираем шаблон - 'debian-8-LAMP';
- Ждем завершения процесса создания и настройки контейнера;
- Смотрим данные по контейнеру (IP, статус, PID...);
- Изучаем вывод текста файла README из выбранного шаблона;
- Для возвращения в главное меню достаточно нажать ENTER.
Рис. 2. Процесс генерации lxc-* команд для выбраненного контейнера а в LXCBuilder.
Действия в данном примере:
- Выбираем 'List & Manage' для вывода списка доступных контейнеров;
- Выбираем контейнер 'testing-proxy';
- Изучаем выведенную по нему информацию и статистические данные;
- Выбираем действие 'Generate lxc-* commands list' для генерации списка часто используемых lxc-* команд;
- Для возврата в главное меню достаточно нажать ENTER.
В завершение
Вот такой получился не сложный и достаточно полезный проект, который экономит мне много полезного времени и ресурсов моего рабочего компьютера.
Думаю что найдется тот, кто читая эту статью захочет задать вопрос в стиле: "А почему не Docker?" - потому что это совсем другой инструмент и с другими возможностями, ориентированный на изоляцию отдельных приложений (микросервисов) и последующую их связку, при необходимости.
В доккере нет системы INIT для запуска и управления множеством процессов, хотя и из этой ситуации можно частично выкрутиться, к примеру использовав функционал одной из программ-супервайзеров в GNU/Linux, вот некоторые из таких пакетов:
- 'runit' - system-wide service supervision;
- 'supervisor' - System for controlling process state.
В отличие от Docker-контейнера, LXC-контейнер содержит полноценную среду операционной системы GNU/Linux, в которой можно развернуть и настроить одновременно множество разных служб и приложений, без всяких 'хаков' и сторонних супервайзеров процессов - это просто, удобно и доступно прямо из коробки GNU/Linux, как говорится: "Батарейки уже в комплекте!".
Успешной контейнеризации!
В функционал пункта меню "Generate lxc-* commands list" добавлена генерация команд "lxc-cgroup", предназначенных для изменения размера памяти (RAM) и количества выделяемых ядер CPU у выбранного контейнера.
Устранена проблема с ошибкой при скачивании шаблонов: "ERROR: Unable to fetch GPG key from keyserver".
В конфигурационный файл добавлена опция для указания адреса предпочитаемого доверенного OpenPGP сервера.
Добавлены шаблоны (чистый образ и LAMP) для Debian 11 Bullseye (amd64).