Docker и LXC решают одну задачу - изолировать нагрузку от системы, - но подходят к ней с разных сторон. Docker упаковывает одно приложение со всеми зависимостями в переносимый образ: контейнер живёт, пока работает процесс, и после остановки изменения в нём не сохраняются. LXC создаёт системный контейнер - полноценное окружение Linux со своими службами, которое ведёт себя как лёгкая виртуальная машина и спокойно работает годами.
Отсюда короткое правило выбора: нужно быстро собирать, разворачивать и обновлять приложения - берите Docker. Нужно перенести в контейнер существующий сервер и администрировать его привычным способом - берите LXC. Ниже разберём, откуда берётся эта разница, что происходит с производительностью и безопасностью и как выбрать под конкретный сценарий.
Контейнер - это изолированное окружение, которое использует ядро хоста, а не своё собственное. Отсюда главное отличие контейнеров от виртуальных машин: гипервизора нет, второй операционной системы нет, накладные расходы минимальны. Общая механика контейнеризации разобрана отдельно - что такое контейнеризация.
Контейнер Docker - это упакованное приложение. В образ кладут исполняемый файл, библиотеки и конфигурацию; запуск такого образа и есть контейнер. Работает он по принципу «один процесс - один контейнер»: веб-сервер отдельно, база отдельно, очередь отдельно. Остановили контейнер - всё, что записалось внутрь, исчезло, если данные не вынесены в том. Такая одноразовость сделана намеренно: образ пересобирают, а не чинят.
Контейнер LXC - это лёгкий сервер. Внутри работает init-система, службы, логи, пакетный менеджер - всё, к чему привык администратор. В него можно зайти по SSH, поставить пакеты, поправить конфиги, и после перезапуска изменения останутся. По ощущениям это виртуальная машина, только без своего ядра и без накладных расходов гипервизора.
Проще всего запомнить так: Docker отвечает на вопрос «как доставить приложение», LXC - на вопрос «как разместить сервер». Обе технологии работают на одних и тех же механизмах ядра Linux - namespaces (пространства имён, изолируют процессы, сеть и файловую систему) и cgroups (control groups, делят процессор, память и диск). Разница не в фундаменте, а в том, что на нём построено.
Прежде чем погружаться в технические детали, стоит понять фундаментальные различия в подходах Docker и LXC. Они определяют архитектуру, а вместе с ней и весь опыт работы с технологиями.
Docker: контейнеры как упаковка приложений
Docker переосмыслил концепцию контейнеров, сместив фокус с изоляции операционных систем на упаковку и доставку приложений. В мире Docker контейнер - это не мини-сервер, а способ упаковать приложение со всеми его зависимостями в переносимый артефакт.
Этот подход проявляется в каждом аспекте Docker. Образы строятся слоями, где каждый слой представляет отдельное изменение в файловой системе. Dockerfile описывает процесс сборки декларативно, позволяя воспроизвести образ в любой среде. Контейнеры по умолчанию неизменяемы - изменения не сохраняются после остановки.
Принцип «один процесс - один контейнер» кардинально отличается от традиционного подхода к серверам. Вместо монолитного сервера с множеством служб Docker предлагает композицию небольших специализированных контейнеров, каждый из которых решает конкретную задачу.

LXC: системные контейнеры как альтернатива виртуализации
LXC (Linux Containers) придерживается более традиционного взгляда на контейнеризацию. Здесь контейнер - это полноценная изолированная среда выполнения, максимально приближенная к виртуальной машине, но работающая на уровне операционной системы.
Подход LXC строится вокруг идеи системного контейнера - среды, в которой может работать полноценная операционная система со всеми её службами. Это позволяет переносить существующие приложения в контейнеры с минимальными изменениями архитектуры.
Долгоживущее состояние в LXC-контейнерах - норма, а не исключение. Контейнеры можно обновлять, настраивать и модифицировать как обычные серверы. Это упрощает работу командам, привыкшим к традиционному системному администрированию.
Docker построен как многослойная архитектура, где каждый компонент выполняет свою роль в жизненном цикле контейнеров.
Движок Docker и runtime
В основе Docker лежит демон, который управляет всеми аспектами жизненного цикла контейнеров. Движок Docker обрабатывает API-запросы, управляет образами, создаёт и останавливает контейнеры, настраивает сеть и хранилище.
containerd - низкоуровневый runtime (среда выполнения), которая фактически запускает контейнеры. Она отвязывает Docker от конкретной реализации контейнерной среды и обеспечивает совместимость с отраслевыми стандартами.
runc - совместимый с OCI runtime, который напрямую обращается к ядру Linux: создаёт namespaces, настраивает cgroups и запускает процессы в изолированном окружении.
Система образов и слоёв
OverlayFS (union-файловая система, объединяющая несколько слоёв в один) - ключевая технология Docker для работы с образами. Каждое изменение создаёт новый слой, а финальный образ - это стек таких слоёв.
Copy-on-write - копирование при записи - оптимизирует использование дискового пространства. Несколько контейнеров разделяют одни и те же базовые слои, а изменения пишутся только в верхний, записываемый слой конкретного контейнера.
Registry (реестр образов) обеспечивает централизованное хранение и распространение образов. Docker Hub, Amazon ECR, Harbor и другие реестры позволяют делиться образами между командами и средами.
Сетевая модель
Сеть в Docker работает в нескольких режимах. Bridge - виртуальная сеть для контейнеров на одном хосте, режим по умолчанию. Host - контейнер использует сетевой стек хоста напрямую, без прослойки. Overlay - связность контейнеров между разными хостами.
Service discovery встроен в сеть Docker: контейнеры находят друг друга по имени, не зная IP-адресов. Для микросервисов это критично - компоненты создаются и уничтожаются динамически, и прибивать адреса гвоздями нельзя.
LXC даёт более прямой и гибкий доступ к механизмам контейнеризации ядра Linux, жертвуя простотой использования ради контроля.
Прямая работа с механизмами ядра
LXC напрямую использует namespaces для изоляции разных аспектов системы: PID для процессов, mount для файловых систем, network для сетевых интерфейсов, user для пользователей и групп.
cgroups в LXC настраиваются явно и дают детальный контроль над ресурсами: процессорное время, лимиты памяти, дисковый ввод-вывод, полоса пропускания сети. Так получаются очень точные политики распределения ресурсов.
Механизмы защиты - SELinux, AppArmor, seccomp - подключаются на более глубоком уровне, что позволяет собирать полноценные политики безопасности под каждый контейнер.
Система управления LXD
LXD - надстройка над LXC, которая добавляет REST API, кластеризацию и продвинутые функции управления. LXD превращает LXC из низкоуровневой технологии в полноценную платформу контейнеризации.
Управление образами в LXD поддерживает разные форматы и источники: от официальных дистрибутивов Linux до собственных образов. Механизм снапшотов позволяет создавать точки восстановления контейнеров.
Живая миграция контейнеров между узлами кластера LXD даёт отказоустойчивость и гибкость в управлении ресурсами. Это особенно ценно для долгоживущих приложений, которые тяжело перезапускать.
Привилегированные и непривилегированные контейнеры
LXC поддерживает и привилегированные контейнеры (запущенные от root), и непривилегированные (от обычного пользователя, с отображением UID/GID). Непривилегированные заметно безопаснее, но кое-где ограничены по функциональности.
User namespace mapping позволяет процессу внутри контейнера работать как root, оставаясь на хосте обычным непривилегированным пользователем. Побег из такого контейнера даёт злоумышленнику права никого - это главный аргумент за непривилегированный режим.
Производительность контейнерных технологий зависит от типа нагрузки, конфигурации хоста и настроек самого контейнера.
Процессор и память
Docker добавляет несколько слоёв абстракции между приложением и ядром Linux, что может сказываться на процессорозависимых задачах. Впрочем, для большинства реальных нагрузок эти накладные расходы незаметны.
LXC работает почти как на голом железе, потому что обращается к механизмам ядра напрямую, без дополнительных прослоек. Для высокопроизводительных вычислений и задач реального времени это может оказаться решающим.
По памяти Docker тратит лишнее на демон, containerd и метаданные образов. В LXC накладные расходы минимальны и сводятся к самой изоляции через namespaces.
Дисковый ввод-вывод
OverlayFS в Docker становится узким местом для приложений, которые много пишут на диск: каждая запись проходит через copy-on-write и получает дополнительную задержку.
LXC работает на обычных файловых системах и настраивается с разными бэкендами хранения - ZFS, Btrfs, LVM. Под конкретный сценарий можно подобрать оптимальный.
Монтирование томов в обеих технологиях позволяет обойти накладные расходы файловой системы: хостовый каталог или блочное устройство пробрасывается в контейнер напрямую. Для баз данных так и делают.
Сетевая производительность
Сеть Docker по умолчанию идёт через bridge с NAT, а это дополнительные расходы на каждый пакет. Host-режим и SR-IOV убирают эту прослойку.
LXC настраивается гибче: от простого моста до прямого подключения к физическому интерфейсу. Под оптимизацию сети места больше.
Богатство экосистемы часто определяет судьбу технологии в корпоративной среде.
Экосистема Docker
Kubernetes стал де-факто стандартом оркестрации контейнеров и работает с Docker-образами через containerd. Отсюда бесшовная интеграция со всем cloud-native стеком. Как устроены оркестраторы и чем они отличаются - в разборе оркестрация контейнеров: Kubernetes, Docker Swarm и Nomad.
Docker Compose описывает многоконтейнерные приложения декларативно, в одном YAML-файле. Для разработки и тестирования это стандарт де-факто.
Интеграция с CI/CD есть во всех основных платформах: GitLab CI, GitHub Actions, Jenkins, TeamCity. Стандартный процесс сборки образов сильно упрощает автоматизацию.
Экосистема LXC и LXD
Поддержка cloud-init в LXD обеспечивает совместимость с облачными подходами к настройке инфраструктуры и упрощает работу с инструментами класса «инфраструктура как код».
Terraform-провайдер для LXD позволяет управлять контейнерами декларативно, модули Ansible закрывают задачи автоматизации.
Интеграция с OpenStack позволяет использовать LXD как гипервизор в облаке OpenStack - контейнерная альтернатива классическим виртуальным машинам.
Мониторинг и наблюдаемость
Prometheus и Grafana имеют готовые интеграции с обеими технологиями, но метрики Docker более стандартизированы благодаря cAdvisor и встроенному API.
Логирование в Docker унифицировано через драйверы логов, поэтому централизовать логи проще. LXC требует ручной настройки сбора.
Распределённая трассировка и APM-решения обычно лучше дружат с Docker - просто потому, что он популярнее в микросервисной архитектуре.
Безопасность контейнеров складывается из изоляции процессов, управления ресурсами, контроля доступа и защиты от уязвимостей.
Общее у обеих технологий и главное, что нужно помнить: ядро у контейнеров общее с хостом. Уязвимость в ядре - риск сразу для всех контейнеров на машине, а побег из контейнера ведёт прямо на хост. Там, где нужна жёсткая граница между арендаторами или обрабатываются чувствительные данные, контейнер не заменяет виртуальную машину.
Модель изоляции
Docker по умолчанию запускает процессы в контейнере от root, но урезает их через Linux capabilities - набор отдельных привилегий вместо всевластия суперпользователя. Rootless-режим позволяет запускать сам демон без прав root и заметно поднимает планку.
LXC даёт более детальный контроль над изоляцией через прямую работу с namespaces и cgroups. Непривилегированные контейнеры обеспечивают сильную изоляцию по умолчанию.
Профили безопасности в обеих технологиях ограничивают доступные контейнеру системные вызовы. AppArmor, SELinux и seccomp подключаются по-разному, но дают дополнительный слой защиты.
Управление уязвимостями
Сканирование образов в экосистеме Docker развито хорошо: Clair, Trivy, Snyk встраиваются в CI/CD и ловят уязвимости автоматически, до выката.
Образы LXC обычно собраны из стандартных дистрибутивов, поэтому патчи ставятся обычным пакетным менеджером. Зато автоматизированное сканирование развито слабее.
Мониторинг безопасности во время работы требует разных подходов: Falco, Sysdig и подобные инструменты адаптированы под специфику каждой технологии.
Безопасность сети
Сетевая изоляция Docker по умолчанию даёт разумный минимум. Пользовательские bridge-сети позволяют разнести разные приложения по изолированным сегментам.
LXC настраивается гибче - вплоть до полной изоляции сети или прямого доступа к сетевому стеку хоста, что открывает дорогу сложным политикам.
Выбор между Docker и LXC чаще определяется сценарием и устройством команды, чем самими технологиями.
Микросервисы и cloud-native приложения
Docker доминирует в микросервисной архитектуре: маленькие сфокусированные контейнеры создавать и обновлять просто. Kubernetes, Istio, Helm заточены именно под этот рабочий процесс.
Подход неизменяемой инфраструктуры, когда контейнер пересоздают вместо обновления, для Docker естественен, но традиционным приложениям требует архитектурных изменений.
DevOps-практики с Docker зрелее из-за стандартных процессов и обширной поддержки инструментов. GitOps на образах Docker реализуется заметно легче.
Унаследованные приложения и системные контейнеры
LXC лучше подходит для переноса традиционных приложений по схеме lift-and-shift - «подняли и перенесли, ничего не переписывая». Полноценное окружение операционной системы сводит правки к минимуму.
Базы данных требуют постоянного состояния и точного контроля ресурсов, и здесь LXC чувствует себя увереннее. PostgreSQL, MySQL, Oracle работают в LXC-контейнере практически как на выделенной машине - под такую нагрузку подбирают серверы баз данных с запасом по памяти и быстрыми дисками.
Мультиарендные среды выигрывают от более сильных гарантий изоляции LXC: рабочие нагрузки разных клиентов разводятся по отдельным контейнерам на общем железе.
Разработка и тестирование
Docker незаменим для воспроизводимых сред разработки. Dockerfile фиксирует точные зависимости и конфигурацию, и у всей команды окружение получается одинаковым.
Интеграционное тестирование через Docker Compose позволяет поднять сложный стек приложений за минуты. Во многих командах это уже стандарт.
LXC полезен там, где нужно полное окружение операционной системы или специфические настройки ядра, которые в Docker-контейнере не воспроизвести.
Edge и IoT
На устройствах с малыми ресурсами часто выбирают LXC: накладных расходов меньше, управление ресурсами прямее. Системный контейнер там ближе к тому, как эти устройства обслуживают.
С другой стороны, экосистема Docker и стандартные модели развёртывания делают его привлекательным для edge-платформ оркестрации, даже с оглядкой на накладные расходы.
Ежедневная эксплуатация у Docker и LXC различается сильнее, чем архитектура.
Резервное копирование и восстановление
Stateless-подход Docker сводит бэкап к реестру образов и постоянным томам. Состояние самого контейнера копировать смысла мало - его пересоздают из образа.
LXC-контейнеры хранят состояние, поэтому им нужен обычный бэкап: снапшоты файловой системы, дампы баз, копии конфигураций. В LXD снапшоты встроены.
План аварийного восстановления тоже разный: Docker делает ставку на быстрый повторный выкат из образов, LXC - на восстановление состояния контейнера на определённый момент.
Обновления и патчи
Обновление в Docker - это пересборка образа на свежей базе и перевыкат. Согласованность отличная, но нужен работающий CI/CD-конвейер.
LXC-контейнеры обновляются на месте обычным пакетным менеджером, как классические серверы. Привычно, но со временем контейнеры расходятся по конфигурации.
Blue-green выкат, когда рядом со старой версией поднимают новую и переключают трафик, с Docker делается почти даром - контейнеры неизменяемы. В LXC под обновление без простоя приходится городить больше оркестрации.
Масштабирование и управление ресурсами
Горизонтальное масштабирование в экосистеме Docker закрыто механизмами Kubernetes - тем же HPA (автомасштабирование по нагрузке). Stateless-природа делает масштабирование тривиальным.
Масштабирование LXC - это обычно создание дополнительных контейнеров и ручная настройка балансировки. Встроенные механизмы здесь заметно менее зрелые.
Зато выделение ресурсов в LXC точнее из-за прямого доступа к cgroups - ценой ручной настройки против абстракций Docker.
У выбора платформы контейнеризации есть долгосрочные денежные последствия, которые выходят за рамки технических предпочтений.
Стоимость лицензирования
Docker остаётся бесплатным для большинства сценариев, но Docker Desktop требует коммерческой лицензии для крупных организаций. На затратах разработки это сказывается.
LXC полностью открыт и не имеет лицензионных ограничений. Правда, и коммерческая поддержка для него менее доступна, чем вокруг Docker.
Стоимость оркестрации тоже разная: управляемый Kubernetes предлагают все облака, а под LXC чаще приходится обходиться своими силами.
Операционные расходы
Инструменты Docker снижают операционные расходы за счёт автоматизации и стандартизации. Зрелые конвейеры и готовые решения уменьшают объём собственной разработки.
LXC требует более специализированных знаний и своих инструментов, что расходы поднимает - но даёт лучший контроль над производительностью и ресурсами.
Обучение персонала тоже стоит по-разному: навыки Docker на рынке распространены шире, а опыт LXC встречается реже и стоит дороже.
Что же выбрать: Docker или LXC?
Сделали итоговую таблицу сравнения.
| Критерий | Выбирайте Docker | Выбирайте LXC |
|---|---|---|
| Тип приложений | Микросервисы, cloud-native приложения, stateless-сервисы | Монолитные приложения, базы данных, унаследованные системы |
| Размер организации | Стартапы, средний бизнес с DevOps-культурой | Крупные предприятия с традиционной IT-структурой |
| Экспертиза команды | Команды разработки, DevOps-инженеры | Системные администраторы, специалисты по Linux |
| Скорость развёртывания | Критична быстрая доставка и частые релизы | Важна стабильность и долгосрочная поддержка |
| Требования к ресурсам | Умеренные, можно пожертвовать эффективностью ради удобства | Высокие требования к производительности и эффективности |
| Операционная модель | Инфраструктура как код, автоматизация, GitOps | Традиционное администрирование, ручное управление |
| Изоляция и безопасность | Достаточно изоляции на уровне приложений | Нужна максимальная изоляция, мультиарендность |
| Интеграция с облаками | Гибридные и мультиоблачные развёртывания | Своя площадка или частное облако |
| Бюджет на обучение | Готовы вкладываться в изучение новых практик | Хотите использовать имеющиеся навыки команды |
| Экосистема инструментов | Нужна богатая экосистема готовых решений | Готовы делать свои инструменты |
| Требования регуляторов | Стандартные требования соответствия | Строгие регуляторные требования, аудит |
| Жизненный цикл приложений | Короткий, частые обновления | Долгий, редкие обновления |
На практике выбор редко бывает взаимоисключающим. Docker и LXC спокойно живут на одной машине: системные службы и базы - в LXC-контейнерах, приложения и микросервисы - в Docker. В Proxmox VE так и делают: LXC под лёгкие Linux-сервисы, виртуальные машины под всё остальное, а Docker запускают уже внутри них.
Docker упаковывает приложение, LXC - целый сервер. В Docker-контейнере обычно один процесс, изменения после остановки пропадают, обновление - это пересборка образа. В LXC-контейнере работает полноценная система со службами, в неё заходят по SSH и обновляют пакетным менеджером, а состояние сохраняется.
LXC чуть быстрее, потому что обращается к механизмам ядра напрямую, без прослойки демона и OverlayFS. Заметна разница в основном на дисковой записи и на задачах, чувствительных к задержкам. Для типовых веб-нагрузок отрыв невелик, и выбирать по производительности обычно не приходится.
Да, но с оговорками. Контейнеру нужны дополнительные разрешения, а в непривилегированном режиме потребуется настройка вложенности. Схема рабочая и часто встречается в Proxmox, однако если Docker нужен «просто чтобы работал», надёжнее поднять его в виртуальной машине.
Под постоянно живущую базу удобнее LXC: состояние сохраняется, ресурсы режутся точно через cgroups, администрирование привычное. В Docker базы тоже запускают, но данные обязательно выносят в отдельный том - иначе они исчезнут вместе с контейнером.
Нет. У контейнеров ядро общее с хостом, у виртуальной машины - своё, и граница у неё жёстче. Контейнеры дают изоляцию по процессам и ресурсам, чего достаточно для большинства задач, но для чувствительных данных и разных арендаторов берут полноценную виртуализацию. Подробнее об этой границе - в разборе контейнеры против полной виртуализации.
Ради скорости и повторяемости. Контейнер стартует за секунды против минут у виртуальной машины, весит десятки мегабайт вместо гигабайтов, и один и тот же образ одинаково запускается на ноутбуке разработчика и на проде. Общее сравнение подходов - в статье виртуализация и контейнеризация: особенности и отличия.
Собираете сервер под контейнеры или смешанную инфраструктуру?
Инженеры ITTELO подберут конфигурацию под ваш сценарий - количество контейнеров и виртуальных машин, память, дисковую подсистему, - соберут и протестируют её под задачу перед отгрузкой, с гарантией и поддержкой после продажи. На рынке серверов 11+ лет.
Сервер для виртуализации купить · +7 (800) 551-80-12 · info@ittelo.ru