LXC vs Docker: контейнеры, которые вы недооцениваете
Когда говорят «контейнеры», большинство сразу думают о Docker. Но Docker — это не единственный и далеко не всегда лучший инструмент. LXC существует с 2008 года и решает совершенно другой класс задач. Разберёмся, чем они принципиально отличаются и когда что использовать.
Принципиальное различие
Docker — это application container. Он изолирует одно приложение с его зависимостями. Философия: один процесс — один контейнер. Образы неизменяемые, состояние эфемерное (если не использовать volumes).
LXC (Linux Containers) — это system container. Внутри работает полноценная операционная система со своим init (systemd), SSH-сервером, пользователями и сетевым стеком. Это «лёгкая виртуальная машина» без гипервизора.
Если Docker — это «запускаю nginx», то LXC — это «у меня есть Ubuntu, на которой я делаю что хочу».
Когда LXC лучше Docker
1. Persistent-сервисы с состоянием
Базы данных, сервисы аутентификации, legacy-приложения, которые не рассчитаны на контейнеризацию. В LXC они работают как в обычной ВМ, без необходимости переписывать логику хранения данных.
2. SSH-доступ и интерактивная работа
Иногда нужно «зайти на сервер» и что-то сделать руками. В LXC это естественно — просто ssh user@container-ip. В Docker это костыль с docker exec -it.
3. Полный systemd
Многие пакеты и приложения рассчитаны на systemd. В Docker запустить systemd внутри контейнера — это боль с --privileged и кучей хаков. В LXC systemd работает как родной.
4. Разработка и тестирование ОС-конфигураций
Тестирование Ansible-плейбуков, puppet-манифестов, настройки сети — всё это удобнее делать в LXC-контейнере, чем поднимать полноценную ВМ.
Proxmox и LXC-шаблоны
Proxmox VE — самая популярная платформа для управления LXC в production. В нём LXC-контейнеры — это первоклассный гражданин наравне с KVM-виртуалками.
Создать контейнер из шаблона:
# Скачать шаблон Ubuntu 22.04
pveam update
pveam download local ubuntu-22.04-standard_22.04-1_amd64.tar.zst
# Создать контейнер (через API или UI)
pct create 101 local:vztmpl/ubuntu-22.04-standard_22.04-1_amd64.tar.zst
--hostname mycontainer
--memory 2048
--cores 2
--net0 name=eth0,bridge=vmbr0,ip=dhcp
--storage local-lvm
--rootfs local-lvm:10
pct start 101
pct enter 101
Контейнер запускается за 1–2 секунды. Снапшоты, клонирование, миграция между нодами — всё это работает как с ВМ.
Unprivileged containers
По умолчанию LXC-контейнеры могут быть privileged (root внутри = root снаружи, опасно) или unprivileged (UID mapping, root внутри ≠ root снаружи).
Unprivileged containers — правильный выбор для production. UID 0 внутри контейнера маппируется на UID 100 000 снаружи. Даже если атакующий выберется из контейнера, он окажется непривилегированным пользователем на хосте.
# Проверка маппинга
cat /proc/self/uid_map # внутри контейнера
# 0 100000 65536
Bind mounts и ресурсные лимиты
Монтирование хостовых директорий в LXC:
# В конфиге контейнера /etc/pve/lxc/101.conf
mp0: /mnt/data,mp=/mnt/data,ro=0
Ресурсные лимиты через cgroups (управляются Proxmox или напрямую):
# CPU лимит: не более 50% двух ядер
pct set 101 --cpulimit 1
# Память с swap
pct set 101 --memory 2048 --swap 512
Incus: современный наследник LXD
Стоит упомянуть Incus — форк LXD, который развивает сообщество после того, как Canonical фактически закрыла LXD для внешних контрибьюторов. Incus активно развивается и поддерживает как LXC-контейнеры, так и виртуальные машины через единый API.
# Запуск контейнера в Incus
incus launch images:ubuntu/22.04 mycontainer
incus exec mycontainer -- bash
Docker для микросервисов, LXC для «лёгких VM»
Практическое правило:
| Сценарий | Инструмент |
|---|---|
| Микросервис, stateless API | Docker |
| CI/CD пайплайн | Docker |
| База данных в изолированной среде | LXC |
| Legacy-приложение с systemd | LXC |
| Тестирование ОС-конфигураций | LXC |
| Kubernetes workloads | Docker/containerd |
Производительность: LXC vs Docker vs VM
В тестах на чистую вычислительную производительность LXC и Docker показывают результаты, близкие к bare metal (накладные расходы менее 1–2%). Разница между ними минимальна — оба используют namespaces и cgroups ядра Linux.
KVM-виртуалка проигрывает обоим на CPU-bound задачах (~3–7% overhead) и на дисковом I/O при использовании эмуляции (до 15–20%, но virtio сводит это к минимуму).
Главное отличие: плотность. На одном хосте с 64 ГБ RAM можно запустить 10–15 KVM-ВМ или 50–100 LXC-контейнеров с тем же набором сервисов.
LXC — недооценённый инструмент, который занимает удобную нишу между Docker и полноценными ВМ. Если вы ещё не пробовали — самое время.
В Proxmox LXC просто незаменимы для инфраструктуры — DNS, мониторинг, небольшие сервисы. Запускается мгновенно, ест минимум памяти. Под базы данных тоже отлично работает.