Определение простыми словами
LXC — это инструмент для запуска изолированных Linux-окружений (контейнеров) на одном физическом или виртуальном сервере. В отличие от KVM или VMware, где каждая машина получает собственное ядро, все LXC-контейнеры используют ядро хост-системы. Это даёт почти нулевые накладные расходы: контейнер стартует за 1-2 секунды и потребляет от 5 МБ RAM на idle.
Изоляция достигается двумя механизмами ядра: namespaces (pid, net, mnt, uts, ipc, user) и cgroups (лимиты CPU, RAM, I/O). С точки зрения приложения внутри контейнера — это полноценная Linux-система со своим /etc, /proc, сетевым стеком и пользовательским пространством. Снаружи — просто группа процессов на хосте.
Сравнение
| Параметр | LXC | Docker | KVM |
|---|---|---|---|
| Ядро | Общее с хостом | Общее с хостом | Своё на каждую VM |
| Старт | 1-3 с | 0.5-2 с | 10-60 с |
| Overhead RAM | ~5-20 МБ | ~10-30 МБ | ~128-512 МБ |
| Изоляция | Средняя (namespace) | Средняя (namespace) | Высокая (аппаратная) |
| Типичный сценарий | Системные контейнеры, VPS-хостинг | Микросервисы, CI/CD | Полная изоляция, Windows-гости |
Кейсы использования
- VPS-хостинг на базе Proxmox VE: провайдеры размещают десятки LXC-контейнеров на одном сервере вместо 10-15 KVM-машин — плотность растёт в 3-5 раз.
- Изолированные среды разработки: разработчик получает контейнер с Ubuntu 22.04, полным стеком LAMP и доступом по SSH, не затрагивая хост.
- Тестирование конфигураций: создать, протестировать и уничтожить контейнер с новой версией nginx занимает менее минуты.
- Лёгкие сервисы: DNS-резолверы, почтовые relay, мониторинговые агенты — всё, что не требует собственного ядра.
- Негативный пример: запускать Windows-гостей или приложения, требующие загрузки кастомных модулей ядра (например, ZFS внутри контейнера), через LXC нельзя — все контейнеры разделяют ядро хоста, и несовместимая нагрузка положит весь хост.
Технические детали
Управление контейнерами через CLI:
lxc-create -t download -n mycontainer -- -d ubuntu -r jammy -a amd64
lxc-start -n mycontainer
lxc-attach -n mycontainer -- bash
lxc-stop -n mycontainer
lxc-destroy -n mycontainer
Лимитирование ресурсов через конфиг /var/lib/lxc/mycontainer/config:
lxc.cgroup2.memory.max = 512M
lxc.cgroup2.cpu.max = 50000 100000
lxc.net.0.type = veth
lxc.net.0.link = lxcbr0
lxc.net.0.flags = up
Проверка статуса и потребления ресурсов:
lxc-ls --fancy
lxc-info -n mycontainer
lxc-top
Непривилегированные контейнеры (unprivileged) запускаются от имени обычного пользователя: uid 0 внутри контейнера маппируется на uid 100000 на хосте через LXD или файлы /etc/subuid и /etc/subgid. Это существенно снижает риск escape-атак при компрометации контейнера.
🔥 Где это применяется
Частые вопросы
Чем LXC отличается от Docker?
LXC — системные контейнеры: внутри работает полноценная Linux-система с init, cron, SSH. Docker ориентирован на запуск одного процесса на контейнер и управляется через образы. Для хостинга виртуальных серверов используют LXC/LXD, для деплоя приложений — Docker.
Безопасно ли использовать LXC для мультиарендных сред?
Привилегированные контейнеры несут риск: root внутри = root на хосте. В продакшн-хостинге используют непривилегированные контейнеры (uid mapping) и AppArmor-профили. Proxmox VE включает эти меры по умолчанию.
Можно ли запустить LXC внутри KVM-машины?
Да, это стандартная схема у VPS-провайдеров: физический сервер → KVM-гипервизор → виртуальные машины → LXC-контейнеры внутри каждой VM. Для вложенной виртуализации потребуется включить параметр nested в настройках KVM-гостя.
Какая минимальная версия ядра нужна для LXC?
Минимум — Linux 3.8 (поддержка user namespaces). Рекомендуется 5.4+: в этих версиях cgroups v2 стабилен, а cgroupv1 продолжает работать для совместимости. Ubuntu 22.04 с ядром 5.15 — оптимальный выбор.