Серверное оборудование для бизнеса — надёжные решения для любых задач Подробнее →
Статья

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 и полноценными ВМ. Если вы ещё не пробовали — самое время.

3 Ответа

  1. В Proxmox LXC просто незаменимы для инфраструктуры — DNS, мониторинг, небольшие сервисы. Запускается мгновенно, ест минимум памяти. Под базы данных тоже отлично работает.

  1. Incus очень активно развивается последний год, уже стабильно использую его вместо LXD. Поддержка VM через virtiofsd и удобный CLI — всё на месте.

  1. А rootless Docker всё-таки решает часть проблем с безопасностью, о которых вы говорите про privileged LXC. Но согласна что для persistent сервисов LXC удобнее.