Системный контейнер — тип контейнера, который запускает полноценное пространство пользователя Linux: init-систему (systemd или OpenRC), несколько системных сервисов, сетевой стек, управление пакетами. В отличие от приложенческих контейнеров (Docker), которые запускают один процесс, системный контейнер ведёт себя как виртуальная машина, но без отдельного ядра.
LXC и LXD как реализация системных контейнеров
LXC (Linux Containers) — первая зрелая реализация системных контейнеров для Linux, появившаяся в 2008 году. Использует namespaces и cgroups ядра Linux. LXD — менеджер поверх LXC от Canonical с REST API и веб-интерфейсом, делающий управление контейнерами похожим на управление ВМ. Incus — форк LXD, возникший после передачи LXD в Canonical в 2023 году.
В Proxmox VE системные контейнеры LXC — полноценные объекты с тем же управлением, что и KVM-ВМ: снапшоты, миграция, мониторинг ресурсов. Proxmox LXC-контейнер потребляет примерно 50–100 МБ RAM на базовую систему против 300–500 МБ для минимальной KVM-ВМ.
Системный контейнер vs Docker
Docker — приложенческий контейнер: один процесс (или несколько связанных), без init, без systemd, эфемерное хранилище. Системный контейнер LXC: множество процессов, systemd, постоянное хранилище как у ВМ, управление пакетами. Docker предназначен для микросервисов и деплоя приложений. LXC — для случаев, когда нужна «виртуальная машина», но без накладных расходов KVM: хостинг нескольких сайтов на одном VPS, изоляция сред разработки, мультитенантный хостинг.
Системный контейнер vs ВМ
ВМ (KVM, VMware) имеет собственное ядро — можно запустить любую ОС, включая Windows. Системный контейнер использует ядро хоста — только Linux и только той же архитектуры. Накладные расходы ВМ — 2–5%, системного контейнера — менее 1%. Безопасность ВМ выше: побег из ВМ требует уязвимости в гипервизоре, побег из контейнера — уязвимости в ядре (и такие случаи были).
OpenVZ и Virtuozzo
OpenVZ — один из первых инструментов системных контейнеров, предшествующий LXC. Virtuozzo — его коммерческая версия. Технология та же: контейнеры на уровне ядра Linux. OpenVZ 7 интегрировал CRIU и сблизился с LXC по возможностям.
История
Первые контейнерные механизмы появились в BSD (chroot в 1982, BSD Jails в 2000). Linux-аналог chroot появился с самым ядром Linux. FreeBSD Jails (2000) — первая зрелая система изоляции для Unix. Linux VServer (2001) и OpenVZ (2005) появились для Linux. LXC включён в ядро Linux 2.6.24 (2008). Docker (2013) популяризировал контейнеры, но как приложенческие. LXD (2015) возродил интерес к системным контейнерам.
Сетевые возможности системных контейнеров
LXC-контейнер получает полноценный сетевой стек: собственный IP-адрес, правила iptables, возможность запустить Nginx или Apache на порту 80 без конфликтов с хостом. Сетевые мосты (br0, virbr0) соединяют контейнеры с физическим интерфейсом. Macvlan позволяет присвоить контейнеру отдельный MAC-адрес и напрямую подключить к физической сети.
Безопасность системных контейнеров
Изоляция LXC-контейнера не абсолютна. Root внутри контейнера по умолчанию — root хоста (UID 0). Механизм user namespaces позволяет «отображать» root контейнера на непривилегированного пользователя хоста (UID 100000). LXD использует unprivileged containers по умолчанию. Уязвимости ядра могут позволить контейнеру «сбежать» на хост — поэтому контейнеры с недоверенным кодом должны работать с дополнительными ограничениями (AppArmor, SELinux, seccomp).
В мультитенантном хостинге системные контейнеры — хороший баланс: изоляция лучше Docker, накладные расходы меньше KVM. Провайдеры на базе LXC/LXD: Linode (LXC до 2016 года), ряд европейских хостеров.